UVA10006 - Carmichael Numbers

时间:2023-03-10 07:16:10
UVA10006 - Carmichael Numbers

题目链接:UVA10006

本来想直接打素数表,然后根据素数表来判断,结果一直超时,后来把素数表去掉,再在for循环中加判断才勉强过了。

Some numbers that are not prime still pass the Fermat test with every number smaller than themselves. These numbers are called Carmichael numbers.

只要按着这两个条件判断即可。

具体看代码:

#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
bool isPrimer(int num);
int powerMode(int,int,int);
//bool primeTable[65010];
int main()
{
// for(int i=1;i<=65010;i++)
// if(isPrimer(i))
// primeTable[i]=1; //素数标为1
// else
// primeTable[i]=0;
int number;
while(cin>>number,number!=0)
{
bool flag=0;
// not prime
if(isPrimer(number))
flag=1;
// pass the Fermat test with every
// number smaller than themselves.
//Let a be a random number between 2 and n - 1
for(int i=2;(i<number)&&!flag;i++)
if(powerMode(i,number,number)!=i)
flag=1; if(flag)
cout<<number<<" is normal."<<endl;
else
cout<<"The number "<<number<<" is a Carmichael number."<<endl;
}
return 0;
}
bool isPrimer(int number)
{
if(number<=2)
return true;
if(number%2==0)
return false;
for(int i=3;i<=ceil(sqrt(number));i++)
if(number%i==0)
return false;
return true;
}
//计算 pow(a,n)%n=a
int powerMode(int a,int n,int mode)
{
long long answer=1;
while(n)
{
if(n&1)
answer=(answer*a)%mode;
a=((long long )a*a)%mode;
n=n>>1;
}
return answer;
}