UVA 10006 - Carmichael Numbers 快速幂
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=947
题目大意:
我们把对任意的1<x<n都有x^n=x mod n成立的合数n称为Carmichael number,给定一个整数n,判断它是不是Carmichael number。
思路:
编译器暂时改为Dev c++ 原来是VS2012 ,为了适应过几周的蓝桥杯编译环境。
直接枚举x用上快速幂即可。
还有要注意的是合数,素数就不是Carmichael number啦。
#include<cstdio> #include<cstring> typedef long long LL; const int MAXN=65000+10; bool primer[MAXN]; LL pow(LL x,LL n,LL mod) //x^n%mod { LL res=1; while(n) { if( n & 1) res=res*x%mod; x=x*x%mod; n>>=1; } return res; } int main() { memset(primer,0,sizeof(primer)); for(int i=2;i*i<MAXN;i++) { if(!primer[i]) for(int j=i;j*i<MAXN;j++) primer[i*j]=1; } int n; while(scanf("%d",&n),n) { bool ok=true; if(!primer[n]) ok=false; if(ok) for(LL i=2;i<n;i++) { LL temp=pow(i,n,n); if(temp!=i) { ok=false; break; } } if(ok) printf("The number %d is a Carmichael number.\n",n); else printf("%d is normal.\n",n); } return 0; }
新 blog : www.hrwhisper.me