poj 3641
用了一些二分的思想。要不会超时。
还要注意一点,问的是非素数的p是否是伪素数
//============================================================================
// Name : 3641.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
long long p, a, ans;
long long t = 0;
long long isprime(long long m){
for(int i = 2;i <= sqrt(m);i++){
if(m%i == 0) return 0;
}
return 1;
}
long long powmod(long long m){
long long temp = 1;
if(m > 100){
long long t0 = powmod(m/2);
temp = (temp*t0)%p;
temp = (temp*t0)%p;
if(m%2 != 0)
temp = (temp*a)%p;
}
else{
for(int i = 1;i <= m;i++){
temp = (temp*a)%p;
++t;
}
}
return temp;
}
int main() {
freopen("a.txt", "r", stdin);
while(scanf("%lld%lld", &p, &a)&&(p||a)){
if(isprime(p)){
printf("no\n");
continue;
}
ans = powmod(p);
if(ans == a){
printf("yes\n");
}
else printf("no\n");
}
return 0;
}

浙公网安备 33010602011771号