题目大意是这样的,输入p,a,两个数如果p是素数输出no,如果p不是素数,判断a^p%p==a是否成立,如果成立输出yes,否则输出no
/* * POJ_3641.cpp * * Created on: 2013年11月19日 * Author: Administrator */ #include <iostream> #include <cstdio> using namespace std; typedef long long ll; /** * 快速幂取模 * 求a^b%m的值 */ ll qpow(ll a, ll b, ll m) { ll ans = 1; while (b) { if (b & 1) { ans *= a; ans %= m; } a *= a; a %= m; b >>= 1; } return ans; } bool MillerRabinTest(ll x,ll n){//以x为底,判定n是否可能为素数 ll y = n-1; while(!(y&1)){ y >>= 1; } x = qpow(x,y,n); while(y < n-1 && x != 1 && x != n-1){ x = (x*x)%n; y <<= (ll)1; } return x == (n-1) || (y&1) == 1; } bool isPrime(ll n){//判断32为内的整数n是否为素数 if(n == 2 || n == 7 || n == 61){//如n为2、7、61,,则n为素数 return true; } if(n == 1 || (n&1) == 0){//若n是1||n是非2偶数,则是合数 return false; } return MillerRabinTest(2,n) && MillerRabinTest(7,n) && MillerRabinTest(61,n); } //以上是MillerRabin的算法模板,它用来测试大素数 int main(){ ll p,a; while(scanf("%lld%lld",&p,&a)!=EOF,p||a){ if(isPrime(p)){ printf("no\n"); continue; } if(qpow(a,p,p) == a){ printf("yes\n"); }else{ printf("no\n"); } } return 0; }