原题链接
分析:主要是要注意,求快速幂Qpow(a,b)时,若b过大(小于或等于10^(10^5))的处理方法:
对n的每个位从小到大进行考虑,使ans=ans*Qpow(x,n[len-1]-‘0’)。
每次考虑完一位后都要x进行x=Qpow(x,10)处理。
这样就能在10^5复杂度内求Qpow(a,b)。
#include <bits/stdc++.h>
using namespace std;
const int maxv=101000;
const int mod=1000000007;
const int maxNum=0x7ffffff-10;
const double eps=1e-7;
typedef long long LL;
char n[maxv];
int len;
LL x,modNum,ans=1;
LL Qpow(LL a,LL b){
LL ans=1;
for(;b;b>>=1){
if(b&1) ans=ans*a%modNum;
a=a*a%modNum;
}
return ans;
}
int main() {
scanf("%lld %s %lld",&x,n,&modNum),len=strlen(n);
if(modNum==1){printf("0");return 0;}
int ind=len-1;
while(n[ind]=='0') n[ind]='9',ind--;
n[ind]--,ind=0;
while(n[ind]=='0') ind++;
for(int i=0;i+ind<len;i++) n[i]=n[ind+i];len-=ind;
while(len>0){ //下面求Qpow(x,n)。
if(n[len-1]!='0'){
ans=ans*Qpow(x,n[len-1]-'0')%modNum;
}
x=Qpow(x,10)%modNum,len--;
}
printf("%lld",ans);
return 0;
}
另外附上python代码:
x,n,mod=map(int,input().split(" "))
print(pow(x,n-1,mod))