PC/UVa 题号: 110702/10006

 主要求a^n mod n=a
一开始直接求,超时,后来写了一个比较快的还是超时,最后看的人家的递归,才过了,数很大,用int会溢出,用long long 或者 unsigned都可以(double不可以mod)
#include <stdio.h>
#include <string.h>
#include <math.h>
#define maxnum 65000
int num[maxnum];
int mid[maxnum];
unsigned n;
void fun()//要先把65000里面的素数都存起来
{
 unsigned i,j;
 num[1]=1;
 for(i=4;i<maxnum;i+=2)
  num[i]=1;
 for(i=3;i<maxnum;i+=2)
 {
  if(num[i]!=1)
   for(j=i+i;j<maxnum;j+=i)
    num[j]=1;
 }
}
unsigned mod(int a,int b)// a^b
{
 if(b==1) return a%n;
 unsigned t=mod(a,b/2);
 t=(t*t)%n;
 if(b%2==1)//如果b不是偶数,需要再乘以一个a
    t=(t*a)%n;
 return t;
}
int solve()
{
 unsigned i;
 for(i=2;i<n;i++)
 {
  if(mod(i,n)%n!=i)
   return 1;
 }
 return 0;
}
int main()
{
 fun();
 while(scanf("%d",&n)!=EOF)
 {
  if(n==0) break;
  if(num[n]!=1||solve()==1)
      printf("%d is normal.\n",n);
  else
  printf("The number %d is a Carmichael number.\n",n);
 }
 return 0;
}

你可能感兴趣的:(PC/UVa 题号: 110702/10006)