GitBook

这里写图片描述

由题意知

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

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

#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