https://nanti.jisuanke.com/t/A1413

AC代码

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cmath>
  4. #include <ctime>
  5. #include <iostream>
  6. #include <algorithm>
  7. #include <map>
  8. using namespace std;
  9. typedef long long ll;
  10. const int NUM=;//运算次数,Miller_Rabin算法为概率运算,误判率为2^(-NUM);
  11. ll t,f[];
  12. ll mul_mod(ll a,ll b,ll n)//求a*b%n,由于a和b太大,需要用进位乘法
  13. {
  14. a=a%n;
  15. b=b%n;
  16. ll s=;
  17. while(b)
  18. {
  19. if(b&)
  20. s=(s+a)%n;
  21. a=(a<<)%n;
  22. b=b>>;
  23. }
  24. return s;
  25. }
  26. ll pow_mod(ll a,ll b,ll n)//求a^b%n
  27. {
  28. a=a%n;
  29. ll s=;
  30. while(b)
  31. {
  32. if(b&)
  33. s=mul_mod(s,a,n);
  34. a=mul_mod(a,a,n);
  35. b=b>>;
  36. }
  37. return s;
  38. }
  39. bool check(ll a,ll n,ll r,ll s)
  40. {
  41. ll ans,p,i;
  42. ans=pow_mod(a,r,n);
  43. p=ans;
  44. for(i=;i<=s;i++)
  45. {
  46. ans=mul_mod(ans,ans,n);
  47. if(ans==&&p!=&&p!=n-)return true;
  48. p=ans;
  49. }
  50. if(ans!=)return true;
  51. return false;
  52. }
  53. bool Miller_Rabin(ll n)//Miller_Rabin算法,判断n是否为素数
  54. {
  55. if(n<)return false;
  56. if(n==)return true;
  57. if(!(n&))return false;
  58. ll i,r,s,a;
  59. r=n-;s=;
  60. while(!(r&)){r=r>>;s++;}
  61. for(i=;i<NUM;i++)
  62. {
  63. a=rand()%(n-)+;
  64. if(check(a,n,r,s))
  65. return false;
  66. }
  67. return true;
  68. }
  69. ll gcd(ll a,ll b)
  70. {
  71. return b==?a:gcd(b,a%b);
  72. }
  73. ll Pollard_rho(ll n,ll c)//Pollard_rho算法,找出n的因子
  74. {
  75. ll i=,j,k=,x,y,d,p;
  76. x=rand()%n;
  77. y=x;
  78. while(true)
  79. {
  80. i++;
  81. x=(mul_mod(x,x,n)+c)%n;
  82. if(y==x)return n;
  83. if(y>x)p=y-x;
  84. else p=x-y;
  85. d=gcd(p,n);
  86. if(d!=&&d!=n)return d;
  87. if(i==k)
  88. {
  89. y=x;
  90. k+=k;
  91. }
  92. }
  93. }
  94. void _find(ll n)//找出n的所有因子
  95. {
  96. if(Miller_Rabin(n))
  97. {
  98. f[t++]=n;//保存所有因子
  99. return;
  100. }
  101. ll p=n;
  102. while(p>=n)p=Pollard_rho(p,rand()%(n-)+);//由于p必定为合数,所以通过多次求解必定能求得答案
  103. _find(p);
  104. _find(n/p);
  105. }
  106. int main()
  107. {
  108. srand(time(NULL));//随机数设定种子
  109. ll n;
  110. while(scanf("%lld",&n)==)
  111. {
  112. if(n == ) {
  113. puts("");
  114. continue;
  115. }
  116. if(Miller_Rabin(n)){
  117. puts("");
  118. continue;
  119. }
  120. t=;
  121. _find(n);
  122. map<ll,ll> ma;
  123. for(int i=;i<t;i++)
  124. ma[f[i]]++;
  125. ll ans=;
  126. for(auto it:ma)
  127. ans*=it.second+;
  128. printf("%lld\n",ans);
  129. }
  130. return ;
  131. }

Pollard_rho定理 大数的因数个数 这个板子超级快的更多相关文章

  1. q次询问,每次给一个x,问1到x的因数个数的和。

    q次询问,每次给一个x,问1到x的因数个数的和. #include<cmath> #include<cstdio> #include<cstring> usingn ...

  2. 积性函数&线性筛&欧拉函数&莫比乌斯函数&因数个数&约数个数和

    只会搬运YL巨巨的博客 积性函数 定义 积性函数:对于任意互质的整数a和b有性质f(ab)=f(a)f(b)的数论函数. 完全积性函数:对于任意整数a和b有性质f(ab)=f(a)f(b)的数论函数 ...

  3. 牛客练习赛25 A 因数个数和(数论分块)

    题意: q次询问,每次给一个x,问1到x的因数个数的和. 1<=q<=10 ,1<= x<=10^9 1s 思路: 对1~n中的每个数i,i作为i,2i,3i,...的约数,一 ...

  4. HDU4704Sum 费马小定理+大数取模

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4704 题目大意: 看似复杂,其实就是求整数n的划分数,4=1+1+2和4=1+2+1是不同的.因而可 ...

  5. 如何求数字n的因数个数及因数和

    我们有可能在某些数学题中会求到某个数的因数和,那我们怎么求呢? 因为我们知道任意一个合数都可以由两个或多个质数相乘得到,那么我们就先分解质因数吧 例:我们随便去一个数吧,嗯,就108了,好算... 我 ...

  6. hdu 4704 Sum【组合数学/费马小定理/大数取模】By cellur925

    首先,我们珂以抽象出S函数的模型:把n拆成k个正整数,有多少种方案? 答案是C(n-1,k-1). 然后发现我们要求的是一段连续的函数值,仔细思考,并根据组合数的性质,我们珂以发现实际上答案就是在让求 ...

  7. 【牛客练习赛 25】A 因数个数和

    题目地址:https://www.nowcoder.com/acm/contest/158/A 参考博客:https://blog.csdn.net/zzcblogs/article/details/ ...

  8. LightOJ-1138 Trailing Zeroes (III) 唯一分解定理 算n!的某个因数个数

    题目链接:https://cn.vjudge.net/problem/ 题意 找一个最小的正整数n 使得n!有a个零 思路 就是有几个因数10呗 考虑到10==2*5,也就是说找n!因数5有几个 数据 ...

  9. 【数论】[因数个数]P4167樱花

    题目描述 求不定方程 \(\frac {1}{x} + \frac{1}{y} = \frac{1}{n!}\)的正整数解的个数 \(n \leq 100^6\) Solution 化简得 \(x * ...

随机推荐

  1. JSON Web Token(JWT)的详解

    1.传统身份验证和JWT的身份验证 传统身份验证: HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用.这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户 ...

  2. 利用for循环和range输出9 * 9乘法口诀表

    li = [2, 3, 4, 5, 6, 7, 8, 9, 10] for i in li: for j in range(1, i): print('{0} * {1} = {2}'.format( ...

  3. LeetCode(23)Merge k Sorted Lists

    题目 Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity ...

  4. Seven Puzzle Aizu - 0121 (搜索)

    7 パズル ime limit1000 ms Memory limit131072 kB OSLinux Source3rd PC Koshien, Final 7 パズルは 8 つの正方形のカードと ...

  5. excel日期格式取年份

    具体思路:先将日期格式更改为常规格式,再取常规格式的前4位数字 例如:A1==1981/12/22 第一步B1=TEXT(A1,"emd") 第二步C1=LEFT(B1,4) 结束

  6. JAVA、JDK等入门概念,下载安装JAVA并配置环境变量

    一.概念 Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言,具体介绍可查阅百度JAVA百科,这里不再赘述. Java分为三个体系,分别为: Java SE(J2SE,Java2 Platf ...

  7. Nginx从入门到放弃-第4章 深度学习篇

    4-1 Nginx动静分离_动静分离场景演示 4-2 Nginx动静分离_动静分离场景演示1 4-3 Nginx的动静分离_动静分离场景演示2 4-4 Rewrite规则_rewrite规则的作用 4 ...

  8. [python][oldboy]list append, extend

    # coding=utf8 li = [1, 3, [1, "liu"], "liu"] print li li.append([1, 2]) print li ...

  9. 《人月神话》读书笔记(2)-week3

    为了确保团队中的每个人都能保持系统概念上的完整性,关于项目的书面规格说明是必不可少的.手册要描绘用户可见的一切,但不应支配实现的过程.光有规格说明也是不够的,会议也是必要的.书中提到的周例会会迅捷地给 ...

  10. Spring c3p0连接池通过Hibernate配置

    首先进行Hibernate配置,详见http://www.cnblogs.com/claricre/p/6509931.html 然后调用这三个包. 配置hibernate.cfg.xml文件: &l ...