题目链接:Carmichael Numbers
题意:这道题是让求输入一个数,让你判断是不是carmichael numbers!当n是素数的时候就直接不是,如果它是合数,并且满足对于所有的1<x<n的所有的x都有(x的n次方等于n),这时候才是那个数,否则还不是那个数!
关于快速幂可以看这两篇博客,感谢大佬
快速幂(C语言实现) 超详细(快速幂取模)
快速幂为什么这么快
注意:i传过去之后,一定要将起转化成long long型的,否则中间会有溢出!
#include<bits/stdc++.h>
#define N 66000
using namespace std;
int prim[N];
typedef long long LL;
void get_prim()//素数打表
{
memset(prim,1,sizeof(prim));
prim[0] = prim[1] = 0;
for(int i = 2; i <= (int)sqrt(N*1.0); i++)
{
if(prim[i])//如果一个数是素数那么它的倍数同样是素数
for(int j = i*2; j <= N; j += i)
{
prim[j] = 0;
}
}
}
LL power(int a,int p,int c)
{
LL ans=1,temp = a%c;
while(p)
{
if(p&1)
ans=(ans*temp)%c;
temp=(temp*temp)%c;
p >>= 1;
}
return ans%c;
}
int main()
{
int n,flag;
get_prim();
while(~scanf("%d",&n) && n)
{
flag = 1;
if(prim[n])//是素数直接正常
flag = 0;
else//否则进行题目给出的公式计算
for(int i = 2; i <= n-1; i++)
{
if(power(i,n,n) != 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;
}