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;}

原创粉丝点击