题目概述
解题思路
这道题的要求是,判断当前的(a, p)是否符合base-a pseudoprime的条件。也就是说,我们先要判断p是否为质数(不是的话就输出no);然后判断是否成立。这一步就是考察快速幂运算的实现了。
算法性能
判断质数算法的复杂度为O(),快速幂运算复杂度为O(),所以整个方法的复杂度为O()。
回顾一下快速幂运算的流程:
维护一个记录当前的幂指数p的变量,一个记录当前结果(res)的变量,一个记录当前的余数的变量即可。
提交结果:
示例代码
#include<iostream>
#include<algorithm>
#include<math.h>
#include<queue>
#include<vector>
using namespace std;
bool isPrime(long long num)
{
if (num == 2 || num == 3)
return 1;
if (num % 6 != 1 && num % 6 != 5)
return 0;
int tmp = sqrt(num);
for (int i = 5; i <= tmp; i += 6)
if (num %i == 0 || num % (i + 2) == 0)
return 0;
return 1;
}
bool mods(long long p, long long a)
{
long long res = 1, temp_a = a, temp_n = p;
while (temp_n > 0)
{
if (temp_n & 1)
{
res = res * temp_a % p;
}
temp_a = temp_a * temp_a % p;
temp_n >>= 1;
}
return res == a;
}
int main()
{
long long P, A;
bool is_prime = false;
do
{
cin >> P >> A;
if (!P)
break;
is_prime = isPrime(P);
if (is_prime == true)
{
cout << "no" << endl;
continue;
}
else
{
is_prime = mods(P, A);
if (is_prime == false)
cout << "no" << endl;
else
cout << "yes" << endl;
}
} while (1);
return 0;
}