标签:[] 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 }
标签:[] col math.h print gcd name main freopen ring
原文地址:https://www.cnblogs.com/-flandre/p/10088980.html