POJ 3641

Pseudoprime numbers
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 7043   Accepted: 2881

Description

Fermat's theorem states that for any prime number p and for any integer a > 1, ap = a (mod p). That is, if we raise a to the pth power and divide by p, the remainder is a. Some (but not very many) non-prime values of p, known as base-pseudoprimes, have this property for some a. (And some, known as Carmichael Numbers, are base-a pseudoprimes for all a.)

Given 2 < p ≤ 1000000000 and 1 < a < p, determine whether or not p is a base-a pseudoprime.

Input

Input contains several test cases followed by a line containing "0 0". Each test case consists of a line containing p and a.

Output

For each test case, output "yes" if p is a base-a pseudoprime; otherwise output "no".

Sample Input

3 2
10 3
341 2
341 3
1105 2
1105 3
0 0

Sample Output

no
no
yes
no
yes
yes











#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#define N 1000009
#define ll __int64
using namespace std;

ll vis[N];

ll fun(ll a)
{

    for(ll i=2;i*i<=a;i++)
    {
        if(a%i==0) return 1;
    }
    return 0;
}

ll pow_mod(ll m,ll n)
{

    ll b=1;
    ll mod=n;
    while(n)
    {
        if(n&1)
         b=(b*m)%mod;
         n=n>>1;
         m=m*m%mod;
    }
    return b;

}

int main()
{
    ll p,a;


    while(~scanf("%I64d %I64d",&p,&a))
    {

       if(a+p==0) break;

       if(fun(p)==0)
       {
           cout<<"no"<<endl;
           continue;
       }

        ll ans=pow_mod(a,p);

        //cout<<"ans="<<ans<<endl;

        if(ans==a)
        cout<<"yes"<<endl;
        else
        cout<<"no"<<endl;

    }
    return 0;
}


你可能感兴趣的:(POJ 3641)