计蒜客 简单的快速幂

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37960603/article/details/82179333

题目传送门

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const int maxn=1000000+100;
const int prinum=100000+100;

int prime[prinum],tot;
bool isprime[prinum];

char B[maxn];
LL A,C;

void init(){

    for(int i=0;i<prinum;i++) isprime[i]=true;
    isprime[0]=isprime[1]=false;
    tot=0;
    for(int i=2;i<prinum;i++){

        if(isprime[i]) prime[tot++]=i;
        for(int j=0;j<tot && i*prime[j]<prinum;j++){

            isprime[i*prime[j]]=false;
            if(!(i%prime[j])) break;
        }
    }
}

LL mypow(LL a,LL b,LL c){

    LL sum=1;
    while(b){

        if(b&1) sum=sum*a%c;
        a=a*a%c;
        b>>=1;
    }
    return sum;
}

int main(){

    init();
    while(scanf("%lld %s %lld",&A,B,&C)==3){

        LL newC=C;
        LL phiC=C;
        for(int i=0;i<tot;i++){

            if(1LL*prime[i]*prime[i]>C) break;
            if(C%prime[i]==0){

                while(C%prime[i]==0) C/=prime[i];
                phiC=phiC/prime[i]*(prime[i]-1);
            }
        }
        if(C!=1) phiC=phiC/C*(C-1);

        int len=strlen(B);
        LL tmpB=0;
        for(int i=0;i<len;i++) tmpB=(tmpB*10+B[i]-'0')%phiC;
        printf("%lld\n",mypow(A,tmpB+phiC,newC));
    }
}

猜你喜欢

转载自blog.csdn.net/qq_37960603/article/details/82179333