UVA_10006

    这个题目可以提前把素数筛除来,然后先判断是否为素数,再用快速幂取模逐个验证a^n mod n是否为a即可。

#include<stdio.h>
#include<string.h>
#include<math.h>
#define MAXD 65010
#define MAXN 65000
int N, prime[MAXD];
int init()
{
scanf("%d", &N);
return N;
}
void prepare()
{
int i, j, k = (int)sqrt(MAXN) + 1;
memset(prime, -1, sizeof(prime));
for(i = 2; i < k; i ++)
if(prime[i])
for(j = i * i; j < MAXN; j += i)
prime[j] = 0;
}
long long int powmod(int a, int n, int m)
{
long long int res;
if(n == 1)
return a % m;
res = powmod(a, n / 2, m);
res = (res * res) % m;
if(n % 2)
return (res * a) % m;
else
return res;
}
int check()
{
int i, j, k;
if(prime[N])
return 0;
for(i = 2; i < N; i ++)
if(powmod(i, N, N) != i)
return 0;
return 1;
}
void solve()
{
if(check())
printf("The number %d is a Carmichael number.\n", N);
else
printf("%d is normal.\n", N);
}
int main()
{
prepare();
while(init())
solve();
return 0;
}



posted on 2011-12-08 23:47  Staginner  阅读(358)  评论(0编辑  收藏  举报