Description
快速幂
准确理解题意:Some numbers that are
not prime still
pass the Fermat test
with every number smaller than themselves. These numbers are called Carmichael numbers
with every number smaller than themselves. These numbers are called Carmichael numbers
#include <iostream>
#include<cstdio>
using namespace std;
long long n;
int p[70000]={0};
long long qm(long long a,long long b){
long long t;
if (b==0) return 1;
if (b==1) return a%n;
if (b%2==0) {
t=qm(a,b/2);
return t*t%n;
} else {
t=qm(a,b/2);
t=t*t%n;
t=t*a%n;
return t;
}
}
int main()
{
int i,j,h;
long long ans;
p[1]=1;
for (i=2;i<=65000/2;i++){
int kk=i;
if (p[i]) continue;
while (kk+i<=65000) {
kk=kk+i;
p[kk]=1;
}
}
cin>>n;
while (n!=0){
ans=0;
h=0;
if (p[n]==0) printf("%d is normal.\n",n);
else {
for (i=2;i<=n-1;i++){
ans=qm(i,n) %n;
if (ans!=i) {h=1;break;}
}
if (h==0) printf("The number %d is a Carmichael number.\n",n);
else printf("%d is normal.\n",n);
}
cin>>n;
}
return 0;
}