题目大意:

给你三个数A,B,P,求

快速幂模板题/xk

但是,我们注意到,P的值很大,可以达到,所以,我们不能直接打快速幂,我们需要搞个龟速乘进去。

代码:

#include<bits/stdc++.h>
using namespace std;
inline unsigned long long ksc(unsigned long long x,unsigned long long y,unsigned long long p){
    unsigned long long ans=0;
    while(y){
        if(y&1){
            ans=(ans+x)%p;
        }
        x=(x+x)%p;
        y>>=1;
    }
    return ans;
}
inline unsigned long long ksm(unsigned long long x,unsigned long long y,unsigned long long p){
    unsigned long long ans=1;
    while(y){
        if(y&1){
            ans=ksc(ans,x,p);
        }
        x=ksc(x,x,p);
        y>>=1;
    }
    return ans;
}
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        unsigned long long A,B,P;
        scanf("%llu%llu%llu",&A,&B,&P);
        printf("%llu\n",ksm(A,B,P));
    }
    return 0;
}

但是,龟速乘实在是烦,我们强烈要求取代龟速乘,怎么办?

我们直接用__int128储存中间计算结果就好辣!

#include<bits/stdc++.h>
using namespace std;
inline unsigned long long ksc(__int128 x,__int128 y,unsigned long long p){
    x*=y;
    return x%p;
}
inline unsigned long long ksm(unsigned long long x,unsigned long long y,unsigned long long p){
    unsigned long long ans=1;
    while(y){
        if(y&1){
            ans=ksc(ans,x,p);
        }
        x=ksc(x,x,p);
        y>>=1;
    }
    return ans;
}
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        unsigned long long A,B,P;
        scanf("%llu%llu%llu",&A,&B,&P);
        printf("%llu\n",ksm(A,B,P));
    }
    return 0;
}

关于龟速乘

它死了/x