素数打表+快速幂取模
先判断是不是素数,不是就直接结束,不然会超时...
#include <iostream>
#include<cstring>
#include<stdio.h>
#include<cmath>
#define maxn 65010
using namespace std;
int vis[maxn];
void sieve()
{
int m = (int)sqrt(maxn + 0.5);
memset(vis,0,sizeof vis);
for(int i = 2;i <= m;i++) if(!vis[i])
for(int j = i * i;j <= maxn;j+=i) vis[j] = 1;
}
long long quick_mod(long long a,long long b,long long m)
{
long long ans = 1;
while(b)
{
if(b&1)
{
ans = (ans * a)%m;
}
b = b>>1;
a = a * a % m;
}
return ans;
}
int main()
{
sieve();
long long n;
long long ans;
while(scanf("%lld",&n),n)
{
int ok = 1;
if(!vis[n]) {printf("%lld is normal.\n",n);continue;}
for(long long i = 2;i <= n - 1;i++)
{
ans = quick_mod(i,n,n);
if(ans != i) {ok = 0;break;}
}
if(ok ) printf("The number %lld is a Carmichael number.\n",n);
else printf("%lld is normal.\n",n);
}
return 0;
}