- #include <iostream>
- using namespace std;
- typedef unsigned __int64 llong;
- llong mod_pro(llong x,llong y,llong n)
- {
- llong ret=0,tmp=x%n;
- while(y)
- {
- if(y&0x1)if((ret+=tmp)>n)ret-=n;
- if((tmp<<=1)>n)tmp-=n;
- y>>=1;
- }
- return ret;
- }
- llong mod(llong a,llong b,llong c)
- {
- llong ret=1;
- while(b)
- {
- if(b&0x1)ret=mod_pro(ret,a,c);
- a=mod_pro(a,a,c);
- b>>=1;
- }
- return ret;
- }
- llong ran()
- {
- llong ret=rand();
- return ret*rand();
- }
- bool is_prime(llong n,int t)
- {
- if(n<2)return false;
- if(n==2)return true;
- if(!(n&0x1))return false;
- llong k=0,m,a,i;
- for(m=n-1;!(m&1);m>>=1,k++);
- while(t--)
- {
- a=mod(ran()%(n-2)+2,m,n);
- if(a!=1)
- {
- for(i=0;i<k&&a!=n-1;i++)
- a=mod_pro(a,a,n);
- if(i>=k)return false;
- }
- }
- return true;
- }
- int main()
- {
- llong n;
- while(scanf("%I64u",&n)!=EOF)
- if(is_prime(n,3))
- cout<<"YES\n";
- else
- cout<<"NO\n";
- return 0;
- }
时间: 2024-10-12 15:09:37