HDU 1905 Pseudoprime numbers(快速幂)

本文介绍了一个算法,该算法通过模幂运算检查给定数值a的p次方p取模是否等于a,并判断p是否为非素数。利用快速幂算法进行高效计算,并通过试除法判断p的素性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

a的p次方p取模等于a,且p不是素数,就输出yes;

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define ll long long
using namespace std;
ll powermod(ll a,ll b,ll c){
	ll ans=1;
	a = a % c;
	while(b>0){
		if(b%2) ans = (ans * a) %c;
		b = b/2;
		a = (a * a)%c;
	}
	return ans;	
} 
bool jud(ll x){
	ll te = sqrt(x);
	for(int i =2 ;i <= te; i++)
		if(!(x % i)) return 1;//x不是素数返回true 
	return 0;
}
int main(){
	ll p,a; 
	while(scanf("%I64d%I64d",&p,&a)){
		if(p == 0&&a == 0) break;
		ll te = powermod(a, p, p);
		if(te == a && jud(p)) puts("yes");
		else puts("no");
	
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Blaze Jack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值