题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21460
这道题是典型的快速幂的题目,但是注意它要求满足的条件不只是快速幂一个条件,还需要满足p不是素数这个条件,实现了这俩点就没有问题了。ac代码如下
#include <cstdio> #include <string> #include <cstring> using namespace std; typedef long long int ll; bool flag; bool is_prime(ll n) { flag = true; for (ll i = 2; i*i <= n; i++) //为什么i*i<=n,因为i与n/i的最小值一定小于n开根号 { if(n%i==0) { flag = false; break; } } return flag; } ll multi_exp(ll a, ll b, ll m) //求的是a的b次幂%m { ll ans = 1; while (b) { if (b & 1) { ans = ans*a; ans %= m; } a = a*a%m; //这里是a的次幂一直上升 b >>= 1; //b右移动 } return ans; } int main(void) { //freopen("in.txt", "r", stdin); ll a, p; while (scanf("%lld%lld", &p, &a) != EOF) { if (a == 0 && p == 0) break; flag = is_prime(p); //判断p是否为素数 ll ans = multi_exp(a, p, p); if (a%p == ans&&flag==false) //既要满足快速幂,又需要满足p不是素数 printf("yes\n"); else printf("no\n"); } return 0; }