uva 10006 Carmichael Numbers

题意:

一个数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",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",n);
52         else printf("%d is normal.\n",n);
53     }
54 
55     return 0;
56 }

 

posted @ 2017-12-13 21:31  qrfkickit  阅读(301)  评论(2编辑  收藏  举报