Carmichael Numbers uva10006

来源:互联网 发布:抽风解说 知乎 编辑:程序博客网 时间:2024/05/18 19:22

题意:

判断一个数是不是Carmichael数

1.此数是合数

2.次数i^n%n==i

思路:

首先用筛选法列出素数与非素数,然后用快速取幂法判断i^n%n的值

代码:

#include<cstdio>#include<cstring>#include<string>using namespace std;const int maxn = 65005;long prime[maxn];long num;int flag[maxn];long n;void init() {num = 0;unsigned long i, j;memset(flag, 0, sizeof(flag));flag[1] = 1;for(i=2; i<maxn; i++) {if(!flag[i]) {prime[num++] = i;for(j=i*i; j<=maxn; j+=i) {//比i小的数已经算过了故直接从i*i开始flag[j] = 1;}}}}long power(long a,long n, long m) {if(n == 0) return 1%m;//返回1if(n == 1) return a%m;long t = power(a, n/2, m);t = ((t%m) * (t%m)) %m;//两个数的乘积的模=两个数的模的乘积再取模,次数乘二if(n%2) t = (t%m * a%m)%m;//如果n是基数,次数加一return t;}bool judge(int x) {long i;for(i=2; i<=n-1; i++)if(power(i, n, n) != i) return false;return true;}int main() {init();while(scanf("%ld", &n)==1 && n) {if(!flag[n])  {  printf("%ld is normal.\n",n);  continue;  }  else  {  if(judge(n))  printf("The number %ld is a Carmichael number.\n",n);  else  printf("%ld is normal.\n",n);  }  }  return 0;  }  


0 0