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;

}

 

你可能感兴趣的:(number)