码迷,mamicode.com
首页 > 其他好文 > 详细

poj1181 大数分解

时间:2014-08-29 21:14:08      阅读:283      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   ar   for   art   

bubuko.com,布布扣
  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         else
119         {
120             min_ans=inf;
121             findMinFactor(n,107);
122             printf("%I64d\n",min_ans);
123         }
124     }
125     return 0;
126 }
View Code

 

poj1181 大数分解

标签:style   blog   http   color   os   io   ar   for   art   

原文地址:http://www.cnblogs.com/djingjing/p/3945667.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!