Description
给定一个n , 我们把对任意的1<x<n都有 x^n=x(mod n)成立的合数 n 称为good number。现求该数是否为good number。
Input
输入一个数 n (n<1000000)
Output
输出YES或NO
Sample Input
561 21
Sample Output
YES NO
通过素数筛将范围中的素数全部预处理出来,如果n为素数,则输出NO,如果不是,则按照题目所给的条件依次快速幂模拟即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1000000;
ll vis[maxn];
ll n;
void sieve()
{
vis[0]=1;vis[1]=1;
vis[2]=0;
for(int i=4;i<=maxn;i+=2)
vis[i]=1;
for(int i=3;i*i<=maxn;i+=2)
{
if(!vis[i])
{
for(int j=i;j*i<=maxn;j++)
{
vis[j*i]=1;
}
}
}
}
ll qpow(ll m,ll cnt)
{
ll res=1;
while(cnt)
{
if(cnt&1)
res=res*m%n;
m=m*m%n;
cnt>>=1;
}
return res;
}
int main()
{
sieve();
while(cin>>n)
{
if(!vis[n])
{
cout<<"NO"<<endl;
continue;
}
int flag=1;
for(int i=2;i<n;i++)
{
if(qpow(i,n)!=i%n)
{
flag=0;
break;
}
}
if(!flag)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
return 0;
}