10006 - Carmichael Numbers
来源:互联网 发布:java中的形参和实参 编辑:程序博客网 时间:2024/06/05 19:54
描述:需要筛选和幂取模,要不然普通算法就会超时,只有合数并且满足所有的a(2<a<n)a^n%n=a才能输出The number %d is a Carmichael number.,否则输出%d is normal.#include <cstdio>#include <cstring>#include <cmath>bool prime[65005];void solve(){ memset(prime,0,sizeof(prime)); int m=sqrt(65005+0.5); for(int i=2; i<=m; i++) if(!prime[i]) for(int j=i*i; j<=65005; j+=i) prime[j]=1;}int pow_mode(int x,int y,int z){ if(y==1) return x; int c=pow_mode(x,y/2,z); long long ans=(long long ) c*c%z; if(y%2==1) ans=ans*x%z; return (int) ans;}int main(){ // freopen("a.txt","r",stdin); solve(); int n,m,flag; while(scanf("%d",&n)!=EOF) { if(!n) break; flag=0; if(prime[n])for(int i=2; i<n; i++) { flag=1; m=pow_mode(i,n,n); if(m!=i) { flag=0; break; } } if(flag) printf("The number %d is a Carmichael number.\n",n); else printf("%d is normal.\n",n); } return 0;}