//素数打表+幂取模
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=65000+5;
bool prime[maxn+100];
void is_prime()
{
memset(prime,true,sizeof(prime));
prime[0]=prime[1]=false;
int k=floor(sqrt(maxn)+0.5);
for(int i=2;i<=k;i++)
if(prime[i]) {
for(int j=i*i;j<=maxn;j+=i)
prime[j]=false;
}
}
int mod_pow(int x,int n,int mod)
{
if(n==0) return 1;
int a=mod_pow(x,n/2,mod);
long long ans=(long long)a*a%mod;
if(n&1) ans=ans*x%mod;
return (int)ans;
}
int main()
{
int n;
is_prime();
while(scanf("%d",&n)==1&&n)
{
bool flag=true;
if(prime[n]) flag=false;
else {
for(int i=2;i<n;i++)
{
if(mod_pow(i,n,n)!=i) {
flag=false;
break;
}
}
}
if(flag) printf("The number %d is a Carmichael number.\n",n);
else printf("%d is normal.\n",n);
}
return 0;
}
uva 10006 素数打表+幂取模(反复平方法)(O(logn))
最新推荐文章于 2024-07-19 22:36:19 发布