POJ_3641(Pseudoprime numbers)

题目链接: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;
}


你可能感兴趣的:(快速幂)