【POJ】[3641]Pseudoprime numbers

这里写图片描述

由题意知

伪素数满足:
①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
");
        else
            printf("no
");
    }
    return 0;
}

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

原文地址:https://www.cnblogs.com/BoilTask/p/12569485.html