hdu 1905 幂成
题意://给一个p 和一个a,如果这个
//p 本身就是一个素数,就输出no,如果不是素数,那么计算 ( a ^ p) % p 如果结果等于a 那么输出yes 否则输出no
zsd:用__int64的时候一定要注意__int64与别的数转化的时候会出错误 所以一定要都是__int64位
//给一个p 和一个a,如果这个
//p 本身就是一个素数,就输出no,如果不是素数,那么计算 ( a ^ p) % p 如果结果等于a 那么输出yes 否则输出no
#include<iostream>
#include<cmath>
using namespace std;
bool isprime(int x)
{
for(int i=2;i<=(int)sqrt(x*1.0)+1;i++)
if(x%i==0)
return false;
return true;
}
bool fun(__int64 x,__int64 e,__int64 p)
{
__int64 a=x;
__int64 base=x;
__int64 sum=1;
while(e>0)
{
if(e&1) sum=(sum*base)%p;
e/=2;
base=(base*base)%p;
}
if(sum==a)
return true;
return false;
}
int main()
{
__int64 p,a;
while(scanf("%I64d%I64d",&p,&a)!=EOF)
{
if(p==a&&p==0) break;
if(isprime(p)) printf("no\n");
else
if(fun(a,p,p))
printf("yes\n");
else printf("no\n");
}
return 0;
}

浙公网安备 33010602011771号