poj1181 大數分解

來源:互聯網
上載者:User

標籤:style   blog   http   color   os   io   ar   for   art   

  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 大數分解

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.