论O(1)快速乘和O(logn)快速乘的差距….

  1. //By SiriusRen
  2. #include <cstdio>
  3. #include <algorithm>
  4. using namespace std;
  5. typedef long long ll;
  6. ll shai[10]={2,3,5,7,11,13,17,19,23,29};
  7. ll mul(ll a,ll b,ll p){
  8. ll d=((long double)a/p*b+1e-8);
  9. ll res=a*b-d*p;
  10. res=res<0?res+p:res;
  11. return res;
  12. }
  13. ll pow(ll x,ll y,ll mod){
  14. x%=mod;ll res=1;
  15. while(y){
  16. if(y&1)res=mul(res,x,mod);
  17. x=mul(x,x,mod),y>>=1;
  18. }return res;
  19. }
  20. bool check(ll a,ll n,ll r,int s){
  21. ll x=pow(a,r,n),pre=x;
  22. for(int i=1;i<=s;i++){
  23. x=mul(x,x,n);
  24. if(x==1&&pre!=1&&pre!=n-1)return 0;
  25. pre=x;
  26. }return x==1;
  27. }
  28. bool miller_rabin(ll n){
  29. if(n<=1)return 0;
  30. ll r=n-1,s=0;
  31. while(!(r&1))r>>=1,s++;
  32. for(int i=0;i<10;i++){
  33. if(shai[i]==n)return 1;
  34. if(!check(shai[i],n,r,s))return 0;
  35. }return 1;
  36. }
  37. ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
  38. ll prime_factor(ll n,ll c){
  39. ll k=2,x=rand()%n,y=x,p=1;
  40. for(int i=1;p==1;i++){
  41. x=(mul(x,x,n)+c)%n;
  42. p=gcd(abs(x-y),n);
  43. if(i==k)y=x,k<<=1;
  44. }return p;
  45. }
  46. ll ans,xx;int cases;
  47. void pollard_rho(ll n){
  48. if(n==1)return;
  49. if(miller_rabin(n)){ans=max(ans,n);return;}
  50. ll p=n;
  51. while(p==n)p=prime_factor(n,rand()%(n-1));
  52. pollard_rho(p),pollard_rho(n/p);
  53. }
  54. int main(){
  55. scanf("%d",&cases);
  56. while(cases--){
  57. ans=0,scanf("%lld",&xx),pollard_rho(xx);
  58. if(ans!=xx)printf("%lld\n",ans);
  59. else puts("Prime");
  60. }
  61. }
  62. 
  1. //By SiriusRen
  2. #include <cstdio>
  3. #include <algorithm>
  4. using namespace std;
  5. typedef unsigned long long ll;
  6. ll shai[10]={2,3,5,7,11,13,17,19,23,29};
  7. ll mul(ll x,ll y,ll mod){
  8. x%=mod;ll res=0;
  9. while(y){
  10. if(y&1)res=(res+x)%mod;
  11. x=(x+x)%mod;
  12. y>>=1;
  13. }return res;
  14. }
  15. ll pow(ll x,ll y,ll mod){
  16. x%=mod;ll res=1;
  17. while(y){
  18. if(y&1)res=mul(res,x,mod);
  19. x=mul(x,x,mod),y>>=1;
  20. }return res;
  21. }
  22. bool check(ll a,ll n,ll r,int s){
  23. ll x=pow(a,r,n),pre=x;
  24. for(int i=1;i<=s;i++){
  25. x=mul(x,x,n);
  26. if(x==1&&pre!=1&&pre!=n-1)return 0;
  27. pre=x;
  28. }return x==1;
  29. }
  30. bool miller_rabin(ll n){
  31. if(n<=1)return 0;
  32. ll r=n-1,s=0;
  33. while(!(r&1))r>>=1,s++;
  34. for(int i=0;i<10;i++){
  35. if(shai[i]==n)return 1;
  36. if(!check(shai[i],n,r,s))return 0;
  37. }return 1;
  38. }
  39. ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
  40. ll prime_factor(ll n,ll c){
  41. ll k=2,x=rand()%n,y=x,p=1;
  42. for(int i=1;p==1;i++){
  43. x=(mul(x,x,n)+c)%n;
  44. p=gcd(abs((long long)x-(long long)y),(long long)n);
  45. if(i==k)y=x,k<<=1;
  46. }return p;
  47. }
  48. ll ans,xx;int cases;
  49. void pollard_rho(ll n){
  50. if(n==1)return;
  51. if(miller_rabin(n)){ans=max(ans,n);return;}
  52. ll p=n;
  53. while(p==n)p=prime_factor(n,rand()%(n-1));
  54. pollard_rho(p),pollard_rho(n/p);
  55. }
  56. int main(){
  57. scanf("%d",&cases);
  58. while(cases--){
  59. ans=0,scanf("%llu",&xx),pollard_rho(xx);
  60. if(ans!=xx)printf("%llu\n",ans);
  61. else puts("Prime");
  62. }
  63. }

BZOJ 3667 Pollard-rho &Miller-Rabin的更多相关文章

  1. poj 1811 Pallor Rho +Miller Rabin

    /* 题目:给出一个数 如果是prime 输出prime 否则输出他的最小质因子 Miller Rabin +Poller Rho 大素数判定+大数找质因子 后面这个算法嘛 基于Birthday Pa ...

  2. Pollard Rho算法浅谈

    Pollard Rho介绍 Pollard Rho算法是Pollard[1]在1975年[2]发明的一种将大整数因数分解的算法 其中Pollard来源于发明者Pollard的姓,Rho则来自内部伪随机 ...

  3. Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法

    BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1044  Solved: 322[Submit][ ...

  4. POJ2429 - GCD & LCM Inverse(Miller–Rabin+Pollard's rho)

    题目大意 给定两个数a,b的GCD和LCM,要求你求出a+b最小的a,b 题解 GCD(a,b)=G GCD(a/G,b/G)=1 LCM(a/G,b/G)=a/G*b/G=a*b/G^2=L/G 这 ...

  5. POJ1811- Prime Test(Miller–Rabin+Pollard's rho)

    题目大意 给你一个非常大的整数,判断它是不是素数,如果不是则输出它的最小的因子 题解 看了一整天<初等数论及其应用>相关部分,终于把Miller–Rabin和Pollard's rho这两 ...

  6. Miller Rabin素数检测与Pollard Rho算法

    一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...

  7. HDU 3864 D_num Miller Rabin 质数推断+Pollard Rho大整数分解

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=3864 题意:给出一个数N(1<=N<10^18).假设N仅仅有四个约数.就输出除1外的三个约 ...

  8. POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】

    Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...

  9. POJ2429_GCD &amp; LCM Inverse【Miller Rabin素数測试】【Pollar Rho整数分解】

    GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9756Accepted: 1819 ...

  10. POJ1811_Prime Test【Miller Rabin素数測试】【Pollar Rho整数分解】

    Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...

随机推荐

  1. 利用JavaScript制作简易日历

    <html xmlns="http://www.w3.org/1999/xhtml" lang="en"> <head> <met ...

  2. mybatis学习笔记之基础复习(3)

    mybatis学习笔记之基础复习(3) mybatis是什么? mybatis是一个持久层框架,mybatis是一个不完全的ORM框架.sql语句需要程序员自己编写, 但是mybatis也是有映射(输 ...

  3. [ Database ] [ SQL Server ] SQL Server 很多不允許的操作解決方法

    說明可參考 https://blog.miniasp.com/post/2012/10/26/SQL-Server-Management-Studio-Prevent-saving-changes-t ...

  4. 以shareExtension为例学习iOS扩展开发

    整体介绍 phone Extension 用法基础详解 share Extension 用法基础详解 demo链接   密码: i72z

  5. Nagios Windows客户端NSClient++ 0.4.x安装配置

    NSClient++ 0.3.x和NSClient++ 0.4.x的配置完全不一样,官方的文档也没有全部更新.我记录下自己的一些操作.   一.下载安装NSClient++ 1.到http://nsc ...

  6. CorelDRAW最高立返500元!还剩30个名额!速抢!

    由于上月CDR X7返利活动收获众多好评 本月官方继续将活动进行到底! 而此次活动不但有上月意犹未尽的CDR X7版,更增加了CDR X6.CDR 2017以及可望不可即的CDR 2018版,可谓是优 ...

  7. JS棋盘

    有一个棋盘,有64个方格,在第一个方格里面放1粒芝麻重量是0.00001kg, 第二个里面放2粒,第三个里面放4,棋盘上放的所有芝麻的重量 <!DOCTYPE html> <html ...

  8. js脚本捕获页面 GET 方式请求的参数?其实直接使用 window.location.search 获得

    js脚本捕获页面 GET 方式请求的参数?其实直接使用 window.location.search 获得

  9. 常用shell备份脚本

    #!/bin/sh # File: /路径/mysql/backup_mydb.sh # Database info DB_NAME="szby" DB_USER="ro ...

  10. 搞定PHP面试 - 变量知识点整理

    一.变量的定义 1. 变量的命名规则 变量名可以包含字母.数字.下划线,不能以数字开头. $Var_1 = 'foo'; // 合法 $var1 = 'foo'; // 合法 $_var1 = 'fo ...