注意线与处理出素数,要不超时啊!
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
bool a[65005];
int n;
long long mod_pow(long long x,long long n,long long mod)
{
if(n==0)
return 1;
long long res=mod_pow(x*x%mod,n/2,mod);
if(n&1)
res=res*x%mod;
return res;
}
void is_prime()
{
memset(a,1,sizeof(a));
a[0]=a[1]=0;
int m=sqrt(65001);
for(int i=2; i<=m; i++)
if(a[i])
{
for(int j=i*2; j<=65001; j+=i)
a[j]=0;
}
}
bool fun(int n)
{
for(int i=2; i<n; i++)
{
long long res=mod_pow(i,n,n);
if((res%n)!=i)
{
return false;
}
}
return true;
}
int main()
{
//freopen("in.txt","r",stdin);
is_prime();
while(scanf("%d",&n),n)
{
if(a[n]==0&&fun(n))
{
cout<<"The number "<<n<<" is a Carmichael number."<<endl;
}
else
cout<<n<<" is normal."<<endl;
}
return 0;
}