计算 a^b 对正整数 c 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出。
思路
直接求a^b然后取模肯定不现实,但可以根据取模公式(a^b)%c=((a%c)^b)%c和(a*b)%c=(a%c*b%c)%c拆分计算,同时利用a^(km+n)=(a^m)^k*a^n公式对b进行逐位求次方。
代码(C++)
1 2 3 4 5 6 7 8 9
| int n=b.size(); int temp=1; int base=a%c; for(int i=n-1;i>=0;i--) { temp=pow(temp,10)%c; temp=(temp*(pow(base,b[i])%c))%c; } return temp;
|
优化:pow函数返回值为double,且数据过大时溢出。根据快速幂算法可以进一步拆分。
快速幂
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| int qpowmod(int x,int n,int vmod) { int temp=1; int base=x%vmod; while(n) { if(n&1) temp=(temp*base)%vmod; base=(base*base)%vmod; n>>1; } return temp; }
int main() { int temp=1; int base=a%c; for(int i=0;i<b.size();i++) { temp=qpowmod(temp,10,c); temp=(temp*qpowmod(base,b[i],c))%c; } return temp; }
|