【POJ】[3641]Pseudoprime numbers

文章字数:212

问题描述

问题分析

由题意知

伪素数满足:
①p不是素数
②存在 1 < a < p使得ap = a (mod p)

现在给出p和a
问当前a能否使p是伪素数
因为数字较大
所以判断素数可直接判断
幂可使用快速幂取模

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<stdio.h>
bool prime(int m) {
	for(int i=2; i*i<=m; i++)
		if(m%i==0)
			return false;
	return true;
}
int pow(int a,int b) {
	int MOD=b;
	__int64 r=1,t=a%MOD;
	while(b) {
		if(b&1)
			r=r*t%MOD;
		t=t*t%MOD;
		b>>=1;
	}
	return (int)r;
}
bool judge(int n,int m) {
	if(prime(n))
		return false;
	if(pow(m,n)==m%n)
		return true;
	return false;
}
int main() {
	int p,a;
	while(scanf("%d %d",&p,&a),p||a) {
		if(judge(p,a))
			printf("yes\n");
		else
			printf("no\n");
	}
	return 0;
}

题目地址:【POJ】[3641]Pseudoprime numbers

该内容采用 CC BY-NC-SA 4.0 许可协议。

如果对您有帮助或存在意见建议,欢迎在下方评论交流。

加载中...