题意: 用a^p == a (mod p)两个数来判断 a^p是否是伪素数,若p是素数,输出"no" ,若a^p是伪素数,输出"yes",否则"no"
题解:当p是奇数时 有:( a^p)mod n = ((a % n) *(a ^ (p - 1)) % n) % n;
当p是偶数时:a ^ p = ( a ^ ( p / 2 ) * a^ ( p / 2));
于是这里用分治求解;
/* * File: main.cpp * Author: ssslpk * * Created on August 28, 2012, 8:57 PM */
#include <cstdlib> #include<cstdio> #include<math.h> #include<iostream> using namespace std; #define int64 long long int64 mod_mult(int64 a, int64 b, int64 n)//(a*b) mod n { int64 s = 0; a = a % n; while (b) { if (b & 1)s = (s + a) % n; a <<= 1; a %= n; b >>= 1; } return s; } int64 mod; int64 p, a; int64 mod_exp(int64 p)//(a^p) mod n { if (p == 1)return a % mod; if (p & 1)return ((a % mod) * mod_exp(p - 1)) % mod; int64 temp = mod_exp(p / 2); return mod_mult(temp, temp, mod); } bool isprime(int64 p) { int64 m = (int64) sqrt((double) p); for (int i = 2; i <= m; i++) { if (p % i == 0)return 0; } return 1; } int main(int argc, char** argv) { while (scanf("%lld%lld", &p, &a), p || a) { mod = p; if (isprime(p)) { printf("no\n"); continue; } if (mod_exp(p) == a)printf("yes\n"); else printf("no\n"); } return 0; }