题目描述:
对于任意x∈[1,n]满足x^n≡x(mod n),这样的n称为CarmichaelNumbers。对于给定的n判断是否是Carmichael Numbers。
解题思路:
可以考虑快速幂,这样时间复杂度就能控制在nlogn之内了。
代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#define LL long long
int a[66000];
void judge_prime()
{
int i,j,m=sqrt(65010+0.5);
memset(a,0,sizeof(a));
for(i=2;i<=m;i++)
{
if(!a[i])
{
for(j=i*i;j<65010;j+=i)
a[j]=1;
}
}
}
LL pow_mod(LL a,LL n,LL m)
{
if(n==0) return 1;
LL x=pow_mod(a,n/2,m);
LL ans=x*x%m;
if(n%2==1) ans=ans*a%m;
return ans;
}
int main()
{
judge_prime();
LL i,n;
bool flag;
while(~scanf("%lld",&n)&&n)
{
if(!a[n])
{
printf("%lld is normal.\n",n);
continue;
}
flag=true;
for(i=2;i<n;i++)
{
if(pow_mod(i,n,n)!=i)
{
flag=false;
break;
}
}
if(flag)
printf("The number %lld is a Carmichael number.\n",n);
else
printf("%lld is normal.\n",n);
}
return 0;
}
本文介绍了一种用于判断Carmichael数的算法,并通过快速幂运算实现了高效的判断过程。该算法利用快速幂将时间复杂度控制在nlogn之内。
2536

被折叠的 条评论
为什么被折叠?



