逆欧拉函数(arc)
题目描述:
已知phi(N),求N。
输入说明:
两个正整数,分别表示phi(N)和K。
输出说明:
按升序输出满足条件的最小的K个N。
样例输入:
8 4
杨丽输出:
15 16 20 24
数据范围:
对于20%的数据 phi(N)<=100
对于40%的数据 phi(N)<=10^5
对于80%的数据 phi(N)<=10^9
对于100%的数据 phi(N)<=10^14,K<=1000
其中有60%的数据满足K=1
输入数据保证符合题意,且满足答案中最大的数不超过10^14。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<ctime>
  6. #define ll long long
  7. using namespace std;
  8. const ll N=1e7;
  9. const ll M=1e5+;
  10. ll n,k,tot,prime[N/],ans[M];
  11. bool check[N+];
  12. void prepare()
  13. {
  14. ll x=min(N,n*);
  15. for(ll i=,t;i<=x;i++)
  16. {
  17. if(!check[i]) prime[++tot]=i;
  18. for(ll j=;j<=tot&&(t=prime[j]*i)<=x;j++)
  19. {
  20. check[t]=;
  21. if(i%prime[j]==) break;
  22. }
  23. }
  24. }
  25. ll mul(ll x,ll y,ll z)
  26. {
  27. ll r=;
  28. for(;y;x<<=,x%=z,y>>=)
  29. {
  30. if(y&)
  31. r+=x,r%=z,y--;
  32. }
  33. }
  34. ll Qc(ll x,ll y,ll z)
  35. {
  36. ll r=;
  37. for(;y;x<<=,x%=z,y>>=)
  38. if(y&)
  39. r=mul(r,x,z);
  40. return r;
  41. }
  42. bool is_prime(ll n)
  43. {
  44. if(n<) return ;
  45. if(n==) return ;
  46. if(!(n&)) return ;
  47. ll m=n-,j=;
  48. for(;!(m%);j++,m>>=);
  49. for(ll a,x,y,i=;i<=;i++)
  50. {
  51. a=rand()%(n-)+;
  52. x=Qc(a,m,n);
  53. for(ll k=;k<=j;k++){
  54. y=mul(x,x,n);
  55. if(y==&&x!=&&x!=n-) return ;
  56. x=y;
  57. }
  58. if(x!=) return ;
  59. }
  60. return ;
  61. }
  62. void dfs(ll x,ll y,ll z)
  63. {
  64. if(x==)
  65. {
  66. ans[++ans[]]=y;return;
  67. }
  68. if(z<=) return;
  69. if(x+>prime[tot]&&is_prime(x+)) ans[++ans[]]=y*(x+);
  70. for(ll a,b,c,i=z;i;i--)
  71. {
  72. if(x%(prime[i]-)==)
  73. {
  74. a=x/(prime[i]-);b=y;c=;
  75. while(a%c==)
  76. {
  77. b*=prime[i];
  78. dfs(a/c,b,i-);
  79. c*=prime[i];
  80. }
  81. }
  82. }
  83. }
  84. int main()
  85. {
  86. srand(time());
  87. scanf("%I64d%I64d",&n,&k);
  88. prepare();
  89. dfs(n,,tot);
  90. sort(ans+,ans+ans[]+);
  91. for(int i=;i<=k;i++)
  92. printf("I64d ",ans[i]);
  93. return ;
  94. }

思路:

算法一

暴力枚举N,暴力求出phi(N)验证答案。

时间复杂度:O(N^1.5)或O(N^2logN)或O(N^(5/4)logN)

期望得分:20-50

算法二

在算法一的基础上,求phi用欧拉线性筛法。

时间复杂度:O(N)

期望得分:50

算法三

考虑到原数只可能有一个大于10^7的质因子。考虑将phi(N)分解,在10^7范围内从大到小暴力搜索质因子试除(从大到小搜索可使状态树上紧下宽),并记录对应的N。一个明显的优化就是如果当前数加一为大于10^7的一个质数(用Miller-Rabin素性测试判)就可以停止这一状态的继续搜索了。虽然看起来复杂度很吓人,不过由于满足条件的N较少等等种种原因,实测还是相当快的。

时间复杂度:O(?)

期望得分:100

济南学习 Day 5 T2 pm的更多相关文章

  1. 济南学习 Day 3 T2 pm

    LYK 快跑!(run)Time Limit:5000ms Memory Limit:64MB题目描述LYK 陷进了一个迷宫! 这个迷宫是网格图形状的. LYK 一开始在(1,1)位置, 出口在(n, ...

  2. 济南学习 Day 2 T2 pm

    她[问题描述]给你L,R,S,M,求满足L≤ (S × x) mod M ≤ R最小的正整数 X.[输入格式]第一行一个数T代表数据组数.接下来一行每行四个数代表该组数据的L,R,S,M.[输出格式] ...

  3. 济南学习 Day 5 T1 pm

    欧拉函数(phi)题目描述: 已知(N),求phi(N). 输入说明: 正整数N. 输出说明: 输出phi(N). 样例输入: 8 样例输出: 4 数据范围: 对于20%的数据,N<=10^5 ...

  4. 济南学习 Day 4 T1 pm

    幸运数字(number)Time Limit:1000ms Memory Limit:64MB题目描述LYK 最近运气很差,例如在 NOIP 初赛中仅仅考了 90 分,刚刚卡进复赛,于是它决定使用一些 ...

  5. 济南学习 Day 4 T2 am

    LYK 与实验室(lab)Time Limit:5000ms Memory Limit:64MB题目描述LYK 在一幢大楼里,这幢大楼共有 n 层,LYK 初始时在第 a 层上.这幢大楼有一个秘密实验 ...

  6. 济南学习 Day 3 T3 pm

    仙人掌(cactus)Time Limit:1000ms Memory Limit:64MB题目描述LYK 在冲刺清华集训(THUSC) !于是它开始研究仙人掌,它想来和你一起分享它最近研究的结果. ...

  7. 济南学习 Day 3 T1 pm

    巧克力棒(chocolate)Time Limit:1000ms Memory Limit:64MB题目描述LYK 找到了一根巧克力棒,但是这根巧克力棒太长了,LYK 无法一口吞进去.具体地,这根巧克 ...

  8. 济南学习 Day 3 T2 am

    看程序写结果(program)Time Limit:1000ms Memory Limit:64MB题目描述LYK 最近在准备 NOIP2017 的初赛,它最不擅长的就是看程序写结果了,因此它拼命地在 ...

  9. 济南学习 Day 2 T3 pm

    它[问题描述]N个人坐成一圈,其中第K个人拿着一个球.每次每个人会以一定的概率向左边的人和右边的人传球.当所有人都拿到过球之后,最后一个拿到球的人即为胜者.求第N个人获胜的概率. (所有人按照编号逆时 ...

随机推荐

  1. Sublime Text3括号配对与代码包围效果BracketHighlighter

    就这么看json等配置文件,太难了,我们需要括号匹配插件BracketHighlighter,但是装完以后只有下划线提示不明显,需要配置     Bracket Settings-Default 文件 ...

  2. nuxt 头部引入js文件 第一次进入页面不加载js文件的解决方法

    head () { return { title: '', meta: [ { hid: 'description', name: 'description', content: '' } ], sc ...

  3. python常用模块之requests

    一.requests 1.GET   url带参数请求 >>> payload = {'key1': 'value1', 'key2': 'value2'} >>> ...

  4. KeyValuePair的使用

    Dictionary<string, string> dc = new Dictionary<string, string>(); 前台页面: <div id=" ...

  5. Android Studio 中安装 apk 被拆分成多个 slice,如何禁止?

    Android Studio 3.0.1 中,Run 'app' 时,生成的 apk 被分割成多个 slice: $ adb install-multiple -r D:\...\app\build\ ...

  6. tableview 删除cell

    正如在以前的帖子说,但是我在转到故事版(StoryBoard)教程之前,我有另外一个问题来回答. 我如何从UITableView删除一行呢? 当人们构建简单的表视图引用程序后,这是另一个常见的​​问题 ...

  7. 【动态规划】loj#2485. 「CEOI2017」Chase

    有意思的可做dp题:细节有点多,值得多想想 题目描述 在逃亡者的面前有一个迷宫,这个迷宫由 nnn 个房间和 n−1n-1n−1 条双向走廊构成,每条走廊会链接不同的两个房间,所有的房间都可以通过走廊 ...

  8. 【Java基础】java中的反射机制与动态代理

    一.java中的反射机制 java反射的官方定义:在运行状态下,可以获取任意一个类的所有属性和方法,并且可通过某类任意一对象实例调用该类的所有方法.这种动态获取类的信息及动态调用类中方法的功能称为ja ...

  9. 初遇Linux

    Ctrl+Alt+(F1-F6):切换虚拟终端 Ctrl+Alt:鼠标切换界面 $:普通用户登录后系统的提示符 #:root用户登录后系统的提示符 Linux命令 exit  用于退出目前的shell ...

  10. python项目开发视频

    精品Python项目开发学习视频 所属网站分类: 资源下载 > python视频教程 作者:乐天派 链接:http://www.pythonheidong.com/blog/article/44 ...