UVA10006->素数筛&&快速幂取模
题意:
判断输入的数是否是Carmichael number
如果一个数n,比它小的所有数a^n%n=a,并且这个数不是质数,则称这个数是Carmichael number
题解:
先用素数筛打表,每次先判断输入的数是不是质数,如果不是,再接着判断这个数是否符合费马定理,如果符合则该数为Carmichael number
代码:
#include <stdio.h>
#include <iostream>
#include <string.h>
#define MAX 65005
bool notprime[MAX] ;
void getprime()
{
memset(notprime , false , sizeof(notprime)) ;
notprime[0] = notprime[1] = true ;
for(int i = 2 ; i < MAX ; i ++)
{
if(!notprime[i])
{
if(i > MAX/i) continue ;
for(int j = i * i ; j < MAX ; j += i)
notprime[j] = true ;
}
}
}
bool pow_m(long long a , long long n , long long MOD)
{
long long ret = 1 ;
long long temp = a % MOD ;
while(n)
{
if(n&1) ret = (ret*temp)%MOD ;
temp = temp * temp %MOD ;
n >>= 1 ;
}
return (ret==a?true:false) ;
}
int main()
{
getprime();
long long n ;
int flag ;
while(scanf("%lld" , &n)!=EOF , n)
{
flag =0 ;
if(notprime[n]) flag = 1 ;
if(flag)
{
for(long long i = 2 ; i < n ; i ++)
{
if(!pow_m(i , n , n))
{
flag = 0 ;
break ;
}
}
}
if(flag) printf("The number %lld is a Carmichael number.\n" , n) ;
else printf("%lld is normal.\n" , n) ;
}
return 0 ;
}