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

PR模板-筛质数

时间:2018-12-08 22:31:01      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:[]   col   math.h   print   gcd   name   main   freopen   ring   

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<algorithm>
 4 #include<string.h>
 5 #include<math.h>
 6 #define ll long long
 7 #define inf 0x7f7f7f7f
 8 #define il inline 
 9 #define fread(a) freopen (a".in", "r", stdin), freopen(a".out", "w", stdout)
10 using namespace std;
11 const ll a[]={2,3,5,7,11,13,17,19,23,29};
12 il ll read()
13 {
14     ll x=0,f=1;
15     char c=getchar();
16     while(c<0 || c>9) {if(c==-) f=-1;c=getchar();}
17     while(c<=9 && c>=0) {x=x*10+c-0;c=getchar();}
18     return x*f;
19 }
20 int n;
21 ll mx,x; 
22 ll gcd(ll a,ll b)
23 {
24     if(!b) return a;
25     return gcd(b,a%b);
26 }
27 il ll mul(ll a,ll b,ll p)
28 {
29     ll tmp=(a*b-(ll)((long double)a/p*b+1e-8)*p);
30     return tmp<0?tmp+p:tmp;
31 }
32 il ll pow(ll a,ll b,ll p)
33 {
34     ll ans=1;a%=p;
35     while(b)
36     {
37         if(b&1) ans=mul(ans,a,p);
38         a=mul(a,a,p);
39         b>>=1;
40     }
41     return ans;
42 }
43 il bool check(ll a,ll n,ll r,ll s)
44 {
45     ll ans=pow(a,r,n),p=ans;
46     for(int i=1;i<=s;i++)
47     {
48         ans=mul(ans,ans,n);
49         if(ans==1 && p!=1 && p!=n-1) return 1;
50         p=ans;
51     }
52     if(ans!=1) return 1;
53     return 0;
54 }
55 il bool MR(ll n)
56 {
57     if(n<=1) return 0;
58     ll r=n-1,s=0;
59     while(r%2==0) r>>=1,s++;
60     for(int i=0;i<10;i++) 
61     {
62         if(a[i]==n) return 1;
63         if(check(a[i],n,r,s)) return 0;
64     }
65     return 1;
66 }
67 il ll rho(ll n,ll c)
68 {
69     ll k=2,x=rand()%n,y=x,p=1;
70     for(ll i=1;p==1;i++)
71     {
72         x=(mul(x,x,n)+c)%n;
73         p=x>y ? x-y : y-x;
74         p=gcd(n,p);
75         if(i==k) y=x,k+=k;
76     }
77     return p;
78 }
79 void solve(ll n)
80 {
81     if(n==1) return;
82     if(MR(n)) {mx=max(mx,n);return;}
83     ll t=n;
84     while(t==n) t=rho(n,rand()%(n-1));
85     solve(t);solve(n/t);
86 }
87 int main()
88 {
89 //    fread("t10");
90     while(scanf ("%lld", &x) != EOF)
91     {
92         mx=0;
93         solve(x);
94         if(mx == x) puts("YE5");
95         else printf("%lld\n",mx);
96     }
97     return 0;
98 }

 

PR模板-筛质数

标签:[]   col   math.h   print   gcd   name   main   freopen   ring   

原文地址:https://www.cnblogs.com/-flandre/p/10088980.html

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