题意:
一个数n如果是合数并且满足对全部的 1 < x < n都有 x^(n) % n == x % n,那么这个数就是Carmichael Number。
给出一个数,判断是否是这种数。
思路:
快速幂,nlogn。
坑:
埃氏筛预处理,要不然会超时;qp一定用long long,不用铁定会爆炸。
代码:
1 #include <stdio.h> 2 3 int n; 4 5 bool prime[65005]; 6 7 long long qp(int x,int p) 8 { 9 if (p == 0) return 1; 10 11 long long ans = qp(x,p / 2) % n; 12 13 ans = ans * ans % n; 14 15 if (p & 1) ans = ans * x % n; 16 17 return ans; 18 } 19 20 int main() 21 { 22 for (int i = 2;i <= 65000;i++) 23 { 24 if (!prime[i]) 25 { 26 for (int j = i * 2;j <= 65000;j += i) prime[j] = 1; 27 } 28 } 29 30 while (scanf("%d",&n) != EOF) 31 { 32 if (n == 0) break; 33 34 bool f = 0; 35 36 if (!prime[n]) 37 { 38 printf("%d is normal. ",n); 39 continue; 40 } 41 42 for (int i = 2;i < n;i++) 43 { 44 if (i % n != qp(i,n) % n) 45 { 46 f = 1; 47 break; 48 } 49 } 50 51 if (!f)printf("The number %d is a Carmichael number. ",n); 52 else printf("%d is normal. ",n); 53 } 54 55 return 0; 56 }