首页 > 代码库 > poj1181 大数分解
poj1181 大数分解
1 //Accepted 164 KB 422 ms 2 //类似poj2429 大数分解 3 #include <cstdio> 4 #include <cstring> 5 #include <ctime> 6 #include <time.h> 7 #include <iostream> 8 #include <algorithm> 9 using namespace std; 10 const __int64 inf = 1LL<<60; 11 __int64 gcd(__int64 a,__int64 b) 12 { 13 if (b==0) return a; 14 return gcd(b,a%b); 15 } 16 __int64 mult_mod(__int64 a,__int64 b,__int64 p) 17 { 18 __int64 res=0,temp=a%p; 19 while (b) 20 { 21 if (b&1) 22 { 23 res+=temp; 24 if (res>=p) res-=p; 25 } 26 temp<<=1; 27 if (temp>=p) temp-=p; 28 b>>=1; 29 } 30 return res; 31 } 32 __int64 exp_mod(__int64 a,__int64 b,__int64 p) 33 { 34 __int64 res=1,exp=a%p; 35 while (b>=1) 36 { 37 if (b&1) 38 res=mult_mod(res,exp,p); 39 exp=mult_mod(exp,exp,p); 40 b>>=1; 41 } 42 return res; 43 } 44 bool miller_rabin(__int64 n,__int64 times) 45 { 46 if (n==2) return true; 47 if (n<2 || !(n&1)) return false; 48 __int64 a,u=n-1,x,y; 49 int t=0; 50 while (u%2==0) 51 { 52 t++; 53 u/=2; 54 } 55 srand(time(0)); 56 for (int i=0;i<times;i++) 57 { 58 a=rand()%(n-1)+1; 59 x=exp_mod(a,u,n); 60 for (int j=0;j<t;j++) 61 { 62 y=mult_mod(x,x,n); 63 if (y==1 && x!=1 && x!=n-1) 64 return false; 65 x=y; 66 } 67 if (y!=1) return false; 68 } 69 return true; 70 } 71 __int64 pollar_rho(__int64 n,int c) 72 { 73 __int64 x,y,d,i=1,k=2; 74 srand(time(0)); 75 x=rand()%(n-1)+1; 76 y=x; 77 while (true) 78 { 79 i++; 80 x=(mult_mod(x,x,n)+c)%n; 81 d=gcd(y-x,n); 82 if (d>1 && d<n) return d; 83 if (y==x) return n; 84 if (i==k) 85 { 86 y=x; 87 k<<=1; 88 } 89 } 90 } 91 __int64 min_ans; 92 void findMinFactor(__int64 n,int c) 93 { 94 if (n==1) return ; 95 if (miller_rabin(n,10)) 96 { 97 if (n<min_ans) min_ans=n; 98 return ; 99 }100 __int64 p=n;101 while (p>=n)102 p=pollar_rho(p,c--);103 findMinFactor(p,c);104 findMinFactor(n/p,c);105 }106 int main()107 {108 int T;109 scanf("%d",&T);110 while (T--)111 {112 __int64 n;113 scanf("%I64d",&n);114 if (miller_rabin(n,10)==true)115 {116 printf("Prime\n");117 }118 else119 {120 min_ans=inf;121 findMinFactor(n,107);122 printf("%I64d\n",min_ans);123 }124 }125 return 0;126 }
poj1181 大数分解
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。