HDU 1905 Pseudoprime numbers【素数】【快速幂】

    xiaoxiao2021-03-25  77

    题目来戳呀

    Problem Description

    Fermat’s theorem states that for any prime number p and for any integer a > 1, a^p == a (mod p). That is, if we raise a to the pth power and divide by p, the remainder is a. Some (but not very many) non-prime values of p, known as base-a pseudoprimes, have this property for some a. (And some, known as Carmichael Numbers, are base-a pseudoprimes for all a.) Given 2 < p ≤ 1,000,000,000 and 1 < a < p, determine whether or not p is a base-a pseudoprime.

    Input

    Input contains several test cases followed by a line containing “0 0”. Each test case consists of a line containing p and a.

    Output

    For each test case, output “yes” if p is a base-a pseudoprime; otherwise output “no”.

    Sample Input

    3 2 10 3 341 2 341 3 1105 2 1105 3 0 0

    Sample Output

    no no yes no yes yes 想法: 先判断素数,再套个快速幂模板。很伤心连模板都不会敲QAQ

    #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; ll quickpow(ll a,ll b,ll c)//a的b次方对c取余 { ll ans=1; a=a%c; while(b) { if(b%2==1) ans=ans*a%c; b>>=1;// b=b/2; a=a*a%c; } return ans; } int main() { int flag; ll a,p; while(~scanf("%lld%lld",&p,&a)&&(a||p)) { flag=0; for(int i=2;i*i<p;++i) { if(p%i==0) { flag=1; break; } } if(!flag) cout<<"no"<<endl; else { ll tem=quickpow(a,p,p); if(tem==a) cout<<"yes"<<endl; else cout<<"no"<<endl; } } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-15995.html

    最新回复(0)