题目:http://uva.onlinejudge.org/external/100/10006.pdf
题意:判断是否为卡迈卡尔数(伪素数)。
分析:http://blog.csdn.net/w20810/article/details/43603799 先判断n是否为素数,若是,肯定不是伪素数。若不是,枚举a:2~n-1,利用费马小定理:若n是素数,则a^n≡a(mod n),对于所有的a都满足等式的话,那么n,就是伪素数。
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
const int maxn=66666;
bool isprime[maxn];
void doprime()
{
long long i,j;
for(i=1;i<maxn;i+=2)
isprime[i]=true;
isprime[1]=false;
isprime[2]=true;
for(i=2;i<maxn;i++)
if(isprime[i])
for(j=i*i;j<maxn;j+=i)
isprime[j]=false;
}
long long kpow(long long x,long long n,long long mod)
{
int ans=1;
while(n)
{
if(n&1)
ans=(ans*x)%mod;
n>>=1;
x=(x*x)%mod;
}
return ans;
}
bool miller_rabin(long long n)
{
int i;
for(i=2;i<=n-1;i++)
if(kpow(i,n,n)!=i)
return false;
return true;
}
int main()
{
int x;
doprime();
while(scanf("%d",&x),x)
isprime[x] || !miller_rabin(x) ?
printf("%d is normal.\n",x):
printf("The number %d is a Carmichael number.\n",x);
return 0;
}