Carmichael Numbers UVA - 10006
考察:快速幂
这题太无语了,如果合数在[2,n-1]范围内都符合等式,那么就是卡迈克尔数.我写了判断条件是随便一个符合就是卡迈尔数.但这很明显错了,存在合数有一些比它小的数符合条件而一些不合法的情况
1 #include <iostream> 2 using namespace std; 3 typedef long long ll; 4 const int N = 65010; 5 int prime[N],cnt; 6 bool st[N]; 7 void GetPrime(int n) 8 { 9 for(int i=2;i<=n;i++) 10 { 11 if(!st[i]) prime[cnt++] = i; 12 for(int j=0;prime[j]<=n/i;j++) 13 { 14 st[prime[j]*i] = 1; 15 if(i%prime[j]==0) break; 16 } 17 } 18 } 19 int qmi(int a,int k,int p) 20 { 21 int res = 1; 22 while(k) 23 { 24 if(k&1) res = (ll)res*a%p; 25 k>>=1; 26 a = (ll)a*a%p; 27 } 28 return res; 29 } 30 int main() 31 { 32 GetPrime(65000); 33 int n; 34 while(scanf("%d",&n)!=EOF&&n) 35 { 36 if(!st[n]) { printf("%d is normal.\n",n); continue; } 37 bool ok = 0; 38 for(int i=2;i<n;i++) 39 if(qmi(i,n,n)!=i) 40 { 41 ok = 1; 42 break; 43 } 44 if(ok) printf("%d is normal.\n",n); 45 else printf("The number %d is a Carmichael number.\n",n); 46 } 47 return 0; 48 }