思路:
预处理素数判断表+快速幂求模
#include <stdio.h>
#include <string.h>
#define LL long long
int is_prime[65010];
void init_table() // prepare the table for judging prime
{
memset(is_prime, 1, sizeof(is_prime));
is_prime[0] = 0;
is_prime[1] = 0;
for (int i = 2; i < 65000; ++i)
if(is_prime[i])
for (int j = 2*i; j < 65000; j += i)
is_prime[j] = 0;
}
LL quick_pow(LL x, LL n, LL pow_num) // get (x^n)%pow_num
{
LL res = 1;
while(n!=0)
{
if(n&1)
res = (res * x)%pow_num;
x = (x * x)%pow_num;
n >>= 1;
}
return res;
}
int main()
{
init_table();
LL n;
while(scanf("%lld", &n)==1&&n)
{
if(is_prime[n])
{
printf("%d is normal.\n", n);
continue;
}
int flag = 1;
for (LL i = 2; i < n; ++i)
{
if(i%n != quick_pow(i, n, n))
{
printf("%d is normal.\n", n);
flag = 0;
break;
}
}
if(flag)
printf("The number %d is a Carmichael number.\n", n);
}
}