poj 3641 Pseudoprime numbers

这个其实比较水,只是用到了一个同余定理,还有一个素数二重筛选;

View Code
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<cstring>
#include<vector>
using namespace std;
int prime[10000],cnt=0;
bool hash[100024];
void Prime( )
{
    int t = ( int )sqrt( 100000.0 ) + 1;
    memset( hash , 0 ,sizeof( hash ) );
    for(int i = 3 ; i <= t ; i += 2 )  
    {
       if( !hash[i>>1] )
       {
          int x = i<<1;
          for( int j = i * i; j <= 100001 ; j += x )
          {
               hash[j>>1] = true;        
          }        
       }    
    }
    cnt = 0;
    prime[cnt++] = 2;
    t = 100000/2;
    for( int i = 1; i <=t ; i ++ )
    {
         if( !hash[i] )
         {
             prime[cnt++] =i * 2 + 1;    
         }
    }
    memset( hash , 0 ,sizeof( hash ) );
    for( int i = 0 ; i < cnt; i ++ )
    {
        hash[prime[i]] = true;
    }
}
bool Solve( int num )
{ 
    for( int i = 0 ;i < cnt ;i ++ )
    {
        if( num <= prime[i]) break;
        if( num%prime[i] == 0  ) return false;
        
    }     
    return true;
}
long long judge( long long a ,long long n , long long p )
{
      if( n ==1 )
      {
        return a%p;        
    }
    else 
    {
       long long t = judge( a , n/2 ,p );
       if( n%2==0 ) return     (t*t) % p;
       else
       {
           return ((( t*t )%p)*( a %p ) )%p;        
       }
    }
}
int main(  )
{
    Prime();
    long long  p,a;
    while( scanf( "%I64d %I64d",&p,&a ),p||a )
    {  
        if(  judge( a ,p, p ) == a  )
        {
           if( Solve( ( int )p ) ) puts( "no" );
           else puts( "yes" );
        }
        else puts( "no" );
    }
    //system( "pause" );
    return 0;
}

 

posted @ 2012-07-14 14:20  wutaoKeen  阅读(183)  评论(0编辑  收藏  举报