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 } 

 

posted @ 2021-01-18 10:06  acmloser  阅读(70)  评论(0编辑  收藏  举报