hdu1905Pseudoprime numbers -快速幂,判素数模板

http://acm.hdu.edu.cn/showproblem.php?pid=1905

题目大意是这样的,输入p,a,两个数,如果p是素数输出no,如果p不是素数,判断a^p%p==a是否成立,如果成立输出yes,否则输出no 

#include<stdio.h>
#include<string>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<stack>
#include<stdlib.h>
#define ll long long
using namespace std;
const ll maxn=1000000005;
//bool notprime[maxn];
/*void init()
{
    memset(notprime,false,sizeof(notprime));
    notprime[0]=notprime[1]=true;
    for(int i=2;i<maxn;i++)
        if(!notprime[i]){
            if(i>maxn/i)continue;
            for(int j=i*i;j<maxn;j+=i)
                notprime[j]=true;
        }
}*/
bool is_prime(const int &n)
{
    for(int i=2;i*i<n;i++)
    {
        if(n%i==0)
        {
            return false;
        }
    }
    return n!=1;
}
ll multi(ll a,ll b,ll p)
{
    ll ret=0;
    while(b){
        if(b&1)ret= (ret+a)%p;
        a=(a+a)%p;
        b>>=1;
    }
    return ret;
}
ll powmod(ll a,ll b,ll p)
{
    ll ret=1;
    while(b)
    {
        if(b&1)ret=multi(ret,a,p)%p;
        a=multi(a,a,p)%p;
        b>>=1;
    }
    return ret;
}
int main()
{
    int a,p;
    ll ans;
    //init();
    while(scanf("%d%d",&p,&a)!=EOF)
    {
        if(a==0&&p==0)break;
        ans=powmod(a,p,p);
        if(is_prime(p))printf("no\n");
        else{
        //cout<<ans<<endl;
        if(ans==a)printf("yes\n");
        else printf("no\n");}
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41568836/article/details/81225232