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
- UVa10006 - Carmichael Numbers
- uva10006 - Carmichael Numbers
- UVA10006- Carmichael Numbers
- Carmichael Numbers uva10006
- UVA10006-快速幂Carmichael Numbers
- UVa10006-Carmichael Numbers 快速幂运算
- UVA10006 - Carmichael Numbers(筛选构造素数表+快速幂)
- UVa10006 Carmichael Numbers【素数判定+快速模幂】
- uva10006 Carmichael Numbers(卡迈克尔数+素数打表)
- Carmichael Numbers
- Carmichael Numbers
- Carmichael Numbers
- UVa 10006 Carmichael Numbers
- uva 10006 - Carmichael Numbers
- UVA 10006 Carmichael Numbers
- UVa 10006 - Carmichael Numbers
- Uva - 10006 - Carmichael Numbers
- 10006 - Carmichael Numbers
- 用宏定义的形式书写代码块
- HDU 5533 Dancing Stars on Me [数学]
- HDU 5289 Assignment(2015 Multi-University Training Contest 1)
- 黄菡经典语录
- linux的root密码忘了解决办法
- Carmichael Numbers uva10006
- Android远程服务——AIDL
- Windows-Git和Github管理自己代码
- Oracle db 重做日志
- /etc/profile 和 ~/.profile 区别是全部用户,和单一用户
- 第十三章编程练习(2)
- 【bzoj2561】最小生成树 最小割
- 使用EA完成数据库设计
- [iOS]防止数组越界及添加空值的crash的扩展