POJ 3641 快速幂
题意:给你两个数:p和a,如果p是素数输出no,如果p不是素数,判断a^p%p==a是否成立,如果成立输出yes,否则输出no。
注意:
1.因为a和p不互质,不能用费马小定理。。。
2. 用long long
// By SiriusRen
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
long long p,a;
bool prime(){
int t=sqrt(p)+1;
for(int i=2;i<=t;i++)
if(!(p%i))return 0;
return 1;
}
long long Pow(long long x,long long y){
long long ans=1,res=x;
while(y){
if(y&1)ans=(ans*res)%p;
res=(res*res)%p;
y>>=1;
}
return ans;
}
int main(){
while(scanf("%lld%lld",&p,&a)&&(p||a)){
if(prime()){puts("no");continue;}
if(Pow(a,p)==a)puts("yes");
else puts("no");
}
}