首页 > 代码库 > 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 }
View Code

 

poj1181 大数分解