这一题,主要是快速求幂的方法的应用。
可以看看快速求幂方法的原理:http://blog.csdn.net/qq_25425023/article/details/44316463
题目的大概意思是:
输入两个数p,a,p为素数,则直接输出no,否则判断a^p % p == a?等于就yes,不等于就no。
理解了题目的意思,就很容易了。
下面的是AC代码:
#include <iostream>
#include <cstdio>
using namespace std;
int is_prime(__int64 x) //判断是否为素数
{
int flag = 0;
for(int i = 2; i * i <= x; i++)
{
if(x % i == 0)
{
flag = 1;
break;
}
}
if(flag)
return 0;
else
return 1;
}
int main()
{
__int64 p, a;
while(scanf("%I64d%I64d", &p, &a) != EOF)
{
if(p == 0 && a == 0)
break;
if(is_prime(p)) //判p是否为素数
{
cout << "no" << endl;
continue;
}
__int64 sum = 1;
int mod = p; //备份p,后面p的值会改变
int ans = a; //备份a,后面a的值会改变
while(p > 0)
{
if(p & 1) //p的二进制数的最后一位为1
sum = sum * a % mod; //sum 乘上
a = a * a % mod; //不断乘以a
p >>= 1; //p除以2;
}
if(sum == ans)
cout << "yes" << endl;
else
cout << "no" << endl;
}
return 0;
}