virtual hust 2013.6.21 NEFU 挑战编程----数论 B - Carmichael Numbers

题目:Carmichael Numbers

思路:直接判是不是素数然后满不满足费马小定理就行了

 

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
#define maxn 66000
int vis[maxn];
void Prime()
{
    memset(vis,1,sizeof(vis));
    vis[0]=vis[1]=0;
    for(int i=2;i*i<maxn;i++)
        if(vis[i])
            for(int j=2*i;j<maxn;j+=i)
                vis[j]=0;
}
long long Pow(long long a,long long b,long long mod)
{
    long long ans=1;
    while(b)
    {
        if(b&1)
        {
            b--;
            ans=(ans*a)%mod;
        }
        else
        {
            b/=2;
            a=(a*a)%mod;
        }
    }
    return ans;
}
bool is_ok(long long n)
{
    bool ans=1;
    for(int i=2;i<n;i++)
    {
        if(Pow(i,n,n)!=i)
        {
            ans=0;
            break;
        }
    }
    return ans;
}
int main()
{
    Prime();
    int n;
    while(scanf("%d",&n),n)
    {
        if(!vis[n]&&is_ok(n))
            printf("The number %d is a Carmichael number.\n",n);
        else
            printf("%d is normal.\n",n);
    }
    return 0;
}
View Code

 

posted @ 2013-06-21 11:25  over_flow  阅读(154)  评论(0编辑  收藏  举报