题意:判断一个数n。如果满足不是素数,并且 (0 < a < n),对任意一个整数a都满足这个式子,就是Carmichael,否则不是。
题解:用幂取模的公式,为了提高效率用分治法。
#include <stdio.h>
#include <string.h>
#include <math.h>
int pow_mod(int a, int n, int m) {
if (n == 1)
return a;
int x = pow_mod(a, n / 2, m);
long long ans = (long long)x * x % m;
if (n % 2 == 1)
ans = ans * a % m;
return (int)ans;
}
int main() {
int n;
while (scanf("%d", &n) && n) {
int flag = 0;
for (int i = 2; i <= sqrt(n); i++)
if (n % i == 0) {
flag = 1;
break;
}
if (!flag) {
printf("%d is normal.\n", n);
continue;
}
for (int i = 1; i < n; i++) {
if (i != pow_mod(i, n, n)) {
flag = 0;
break;
}
}
if (!flag)
printf("%d is normal.\n", n);
else
printf("The number %d is a Carmichael number.\n", n);
}
return 0;
}