当x>oula(m)并且gcd(a,m)==1时,a^x = a^(k*oula(m))*a^(x%oula(m)),而a^(k*oula(m)) =1 mod m;所以如图显示:

欧拉降幂公式_#include

#include<cstdio>
#include<cmath>
int gcd(int a,int b) {
    return !b?a:gcd(b,a%b);
}
int oula(int n) {
    if(n==1)
        return 1;
    int ans=n,m=sqrt(n);
    for(int i=2; i<=m; ++i) {
        if(!(n%i)&&!n) {
            ans=ans/i*(i-1);
            while(!(n%i)&&!n)
                n/=i;
        }
    }
    if(n)
        ans=ans/n*(n-1);
    return ans;
}
long long qpow(int x,int n,int mod) {
    long long d=1;
    while(n>0) {
        if(n&1)//若n为奇数
            d=d*x%mod;
        x=x*x%mod;
        n>>=1;//n除二
    }
    return d%mod;
}
int main() {
    int n,x,mod;
    scanf("%d %d %d",&x,&n,&mod);
    if(n>oula(mod)&&gcd(x,mod)==1)//若gcd(x,m)==1
        n%=oula(mod);
    else if(gcd(x,mod)>1)//若gcd(x,m)>1
        n=n%oula(mod)+oula(mod);
    printf("%lld\n", qpow(x,n,mod));
    return 0;
}