思路:

这道题是个图论抽象的题目……

考场上想到了没写对……

我们发现,f函数转移的方式有两种,要么是代价10的+1,要么是代价1的乘一个质因数

那么我们就可以将这个抽象为一张图

每个i向每个i+1连一条边权为10的边

每个i向每个i*质因子[j]连一条边权为1的边

跑最短路即可

跑完最短路就是状压搜索

加上最优化剪枝和记忆化剪枝即可

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #define rii register int i
  6. #define rij register int j
  7. #define int long long
  8. using namespace std;
  9. int k,dp[];
  10. int ans,sl,ss[],sk,s[],minx,head[],cnt,jl[];
  11. int fin=,dis[];
  12. struct uio{
  13. int nxt,to,val;
  14. }x[];
  15. void add(int from,int to,int val)
  16. {
  17. cnt++;
  18. x[cnt].to=to;
  19. x[cnt].val=val;
  20. x[cnt].nxt=head[from];
  21. head[from]=cnt;
  22. }
  23. //void dfs(int p,int q,int dj,int sd)
  24. //{
  25. // if(sd>100)
  26. // {
  27. // return;
  28. // }
  29. // if(dj>ans)
  30. // {
  31. // return;
  32. // }
  33. // if(q==0)
  34. // {
  35. // ans=min(ans,dj);
  36. // return;
  37. // }
  38. // dfs(p,(q+1)%p,dj+10,sd+1);
  39. // for(rii=1;i<=sl;i++)
  40. // {
  41. // dfs(p,(q*s[i])%p,dj+1,sd+1);
  42. // }
  43. //}
  44. void djstl(int wz)
  45. {
  46. for(rii=head[wz];i!=;i=x[i].nxt)
  47. {
  48. if(dis[x[i].to]>dis[wz]+x[i].val)
  49. {
  50. dis[x[i].to]=dis[wz]+x[i].val;
  51. djstl(x[i].to);
  52. }
  53. }
  54. }
  55. void cf(int val)
  56. {
  57. cnt=;
  58. memset(head,,sizeof(head));
  59. sl=;
  60. for(rii=;i<=val;i++)
  61. {
  62. if(val%i==)
  63. {
  64. val/=i;
  65. if(s[sl]!=i)
  66. {
  67. sl++;
  68. s[sl]=i;
  69. i--;
  70. }
  71. }
  72. if(val==)
  73. {
  74. return;
  75. }
  76. }
  77. }
  78. int f(int val)
  79. {
  80. cnt=;
  81. memset(x,,sizeof(x));
  82. memset(head,,sizeof());
  83. memset(dis,0x3f,sizeof(dis));
  84. int p=,q=,ltt=val;
  85. while(ltt>)
  86. {
  87. p+=ltt%;
  88. ltt/=;
  89. }
  90. p+=;
  91. ltt=val;
  92. while(ltt>)
  93. {
  94. q*=ltt%;
  95. ltt/=;
  96. }
  97. cf(val);
  98. q+=;
  99. q%=p;
  100. for(rii=;i<p;i++)
  101. {
  102. for(rij=;j<=sl;j++)
  103. {
  104. add(i,i*s[j]%p,);
  105. }
  106. add(i,(i+)%p,);
  107. }
  108. dis[q]=;
  109. djstl(q);
  110. return dis[];
  111. }
  112. void cfk(int val)
  113. {
  114. sk=;
  115. for(rii=;i<=val;i++)
  116. {
  117. if(val%i==)
  118. {
  119. val/=i;
  120. if(ss[sk]!=i)
  121. {
  122. sk++;
  123. ss[sk]=i;
  124. i--;
  125. }
  126. }
  127. if(val==)
  128. {
  129. return;
  130. }
  131. }
  132. }
  133. inline int gtv(int v)
  134. {
  135. int kkk=,cnt=;
  136. while(v!=)
  137. {
  138. cnt++;
  139. if(v%==)
  140. {
  141. kkk*=ss[cnt];
  142. }
  143. v/=;
  144. }
  145. return kkk;
  146. }
  147. void kfs(int zt,int dj)
  148. {
  149. if(dp[zt]>dj)
  150. {
  151. dp[zt]=dj;
  152. }
  153. else
  154. {
  155. return;
  156. }
  157. if(dj>=fin)
  158. {
  159. return;
  160. }
  161. if(dj<fin&&zt==(<<sk)-)
  162. {
  163. fin=dj;
  164. return;
  165. }
  166. for(rii=;i<=(<<sk)-;i++)
  167. {
  168. if((zt&i)==)
  169. {
  170. kfs(zt|i,dj+f(gtv(i)));
  171. }
  172. }
  173. }
  174. signed main()
  175. {
  176. freopen("k.in","r",stdin);
  177. freopen("k.out","w",stdout);
  178. memset(dp,0x3f,sizeof(dp));
  179. cin>>k;
  180. cfk(k);
  181. if(sk==)
  182. {
  183. cout<<f(k);
  184. return ;
  185. }
  186. fin=f(k);
  187. kfs(,);
  188. cout<<fin;
  189. }

20181031noip模拟赛T2的更多相关文章

  1. 模拟赛T2 交换 解题报告

    模拟赛T2 交换 解题报告 题目大意: 给定一个序列和若干个区间,每次从区间中选择两个数修改使字典序最小. \(n,m\) 同阶 \(10^6\) 2.1 算法 1 按照题意模拟,枚举交换位置并比较. ...

  2. 20161003 NOIP 模拟赛 T2 解题报告

    Weed duyege的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹. 为了查出真相,duyege 准备修好电脑之后再进行一次金坷垃的模拟实验. 电脑上面有若干层金坷垃,每次只能在上面撒上一层高度为 ...

  3. NOIP欢乐模拟赛 T2 解题报告

    小澳的坐标系 (coordinate.cpp/c/pas) [题目描述] 小澳者表也,数学者景也,表动则景随矣. 小澳不喜欢数学,可数学却待小澳如初恋,小澳睡觉的时候也不放过. 小澳的梦境中出现了一个 ...

  4. 20180530模拟赛T2——绀碧之棺

    题目背景 qiancl 得到了一张藏宝图,上面写了一道谜题. 题目描述 定义\(F(n)\)为 n 在十进制下各个数位的平方和,求区间\([a,b]\)中有多少\(n\)满足\(k\times F(n ...

  5. 20180519模拟赛T2——pretty

    [问题描述] 小美今天对于数列很有兴趣.小美打算找出一些漂亮的序列.一个漂亮的序列的限制如下: 长度为 n ,而且数列里只包含 [1,n] 的整数. 要不是不降的序列就是不升的序列. 小美想知道有多少 ...

  6. 2019.11.11 模拟赛 T2 乘积求和

    昨天 ych 的膜你赛,这道题我 O ( n4 ) 暴力拿了 60 pts. 这道题的做法还挺妙的,我搞了将近一天呢qwq 题解 60 pts 根据题目给出的式子,四层 for 循环暴力枚举统计答案即 ...

  7. 5.12 省选模拟赛 T2 贪心 dp 搜索 差分

    LINK:T2 这题感觉很套路 但是不会写. 区间操作 显然直接使用dp不太行 直接爆搜也不太行复杂度太高. 容易想到差分 由于使得整个序列都为0 那么第一个数也要i差分前一个数 强行加一个0 然后 ...

  8. 20161023 NOIP 模拟赛 T2 解题报告

    Task 2.回文串计数 (calc.pas/calc.c/calc.cpp) [题目描述] 虽然是一名理科生,Mcx常常声称自己是一名真正的文科生.不知为何,他对于背诵总有一种莫名的热爱,这也促使他 ...

  9. 20161005 NOIP 模拟赛 T2 解题报告

    beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...

随机推荐

  1. 131.004 监督学习项目 | 为CharityML寻找捐献者

    监督学习: 为CharityML寻找捐献者   开始 在这个项目中,你将使用1994年美国人口普查收集的数据,选用几个监督学习算法以准确地建模被调查者的收入.然后,你将根据初步结果从中选择出最佳的候选 ...

  2. windows7x64系统中配置mysql5.7.17为本地开发环境(win2008类似)

    1. 下载mysql压缩包mysql-5.7.17-winx64.ziphttps://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.17-winx64.z ...

  3. Android沉浸式状态栏

    private void initWindows() { Window window = getWindow(); int color = getResources().getColor(androi ...

  4. 从golang-gin-realworld-example-app项目学写httpapi (四)

    https://github.com/gothinkster/golang-gin-realworld-example-app/blob/master/users/routers.go 路由定义 pa ...

  5. SQL读取注册表值

    最近写一个自动检查SQL Serve安全配置的检查脚本,需要查询注册表,下面是使用SQL查询注册表值的方法. ) ) ) ) --For Named instance --SET @Instance ...

  6. iTextSharp 使用详解(转) 感谢原著作者 .

    TextSharp是一个生成Pdf文件的开源项目,最近在项目中有使用到这个项目,对使用中的经验作一个小结. ITextSharp中相关的概念: 一.Document 这个对象有三个构造函数: 隐藏行号 ...

  7. C指针和数组

    一.指针 指针就是地址,指针变量是用来存放地址的变量,把谁的地址存放在指针变量中,就说此指针变量指向谁. 二.数组 1.一维数组 一维数组名代表数组首元素的地址,因此 *a=a[0]; &:取 ...

  8. 如何恢复在Windows 10中被永久删除的照片?

    照片被误删除了需要恢复?这里推荐一款软件:winutilities.使用WinUtilities文件恢复向导允许您通过简单的点击恢复已删除的照片或从Windows 10回收站中恢复被删除的照片. 恢复 ...

  9. mysql之mof提权详解

    原理解读: Windows 管理规范 (WMI) 提供了以下三种方法编译到 WMI 存储库的托管对象格式 (MOF) 文件: 方法 1: 运行 MOF 文件指定为命令行参数将 Mofcomp.exe  ...

  10. list 去重并保持原来排序

    public <T> List<T> removeDuplicateKeepOrder(List<T> list){ /* Set set = new HashSe ...