心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0
题目大意:判断一个数字n是不是Carmichael number,所谓Carmichael number,满足两个条件:是合数;对于任意a(2<=a<=n-1),都有a^n mod n=a。
只需要预处理筛素数和了解快速幂取模即可。
以下是我的代码:
#include<stdio.h>
#include
<math.h>
const long maxn=65007;
bool isPrime[maxn];
void get_prime()
{
    
long Prime[maxn],tot;
    
for(long i=1;i<maxn;i++) isPrime[i]=true;
    isPrime[
1]=false;
    tot
=0;
    
for(long i=2;i<maxn;i++)
    {
       
if(isPrime[i])
       {
          tot
++;Prime[tot]=i;
       }
       
for(long j=1;j<=tot&&i*Prime[j]<maxn;j++)
       {
          isPrime[i
*Prime[j]]=false;
          
if(i%Prime[j]==0break;
       }
    }
}
long mod(long a,long n,long b)
{
    
if(n==1return a%b;
    
long ans=mod(a,n/2,b);
    ans
=(ans*ans)%b;
    
if(n%2==1return ans*a%b;
    
return ans;
}
bool check(long n)
{
    
for(long i=2;i<=n-1;i++)
      
if(mod(i,n,n)!=i)
        
return false;
    
return true;
}
int main()
{
    
/*
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);
    //
*/
    
long n;
    get_prime();
    
while(scanf("%ld",&n)==1)
    {
       
if(n==0break;
       
if(!isPrime[n]&&check(n))
         printf(
"The number %ld is a Carmichael number.\n",n);
       
else printf("%ld is normal.\n",n);
    }
return 0;
}


posted on 2010-01-23 19:56 lee1r 阅读(989) 评论(0)  编辑 收藏 引用 所属分类: 题目分类:数学/数论

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理