poj 3641 Pseudoprime numbers
这个其实比较水,只是用到了一个同余定理,还有一个素数二重筛选;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }