http://acm.hdu.edu.cn/showproblem.php?pid=1905
题目大意是这样的,输入p,a,两个数,如果p是素数输出no,如果p不是素数,判断a^p%p==a是否成立,如果成立输出yes,否则输出no
#include<stdio.h>
#include<string>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<stack>
#include<stdlib.h>
#define ll long long
using namespace std;
const ll maxn=1000000005;
//bool notprime[maxn];
/*void init()
{
memset(notprime,false,sizeof(notprime));
notprime[0]=notprime[1]=true;
for(int i=2;i<maxn;i++)
if(!notprime[i]){
if(i>maxn/i)continue;
for(int j=i*i;j<maxn;j+=i)
notprime[j]=true;
}
}*/
bool is_prime(const int &n)
{
for(int i=2;i*i<n;i++)
{
if(n%i==0)
{
return false;
}
}
return n!=1;
}
ll multi(ll a,ll b,ll p)
{
ll ret=0;
while(b){
if(b&1)ret= (ret+a)%p;
a=(a+a)%p;
b>>=1;
}
return ret;
}
ll powmod(ll a,ll b,ll p)
{
ll ret=1;
while(b)
{
if(b&1)ret=multi(ret,a,p)%p;
a=multi(a,a,p)%p;
b>>=1;
}
return ret;
}
int main()
{
int a,p;
ll ans;
//init();
while(scanf("%d%d",&p,&a)!=EOF)
{
if(a==0&&p==0)break;
ans=powmod(a,p,p);
if(is_prime(p))printf("no\n");
else{
//cout<<ans<<endl;
if(ans==a)printf("yes\n");
else printf("no\n");}
}
return 0;
}