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; }