例:
a ^123456789%mod = a ^(1e8 * 1 )%mod * a ^(1e7 * 2 )%mod * a ^(1e6 * 3 )%mod * a ^(1e5 * 4 )%mod * a ^(1e4 * 5 )%mod * a ^(1e 3 * 6 )%mod * a ^(1e2 * 7 )%mod * a ^(1e1 * 8 )%mod * a ^(1e0 * 9 )%mod
若a的指数极大则可用字符串存储:
由此核心代码如下:
快速幂:
int mod;
long long powl(long long x,long long n){
if(n == 0) return 1;
if(n == 1) return x;
if(n&1) return powl(x*x%mod,n/2)*x%mod;
else return powl(x*x%mod,n/2);
}
指数分解:
long long ans = 1;
for(int i = m-1;i >= 0;i--){
ans = (ans*powl(a,(s[i]-'0')))%mod;
a = powl(a,10)%mod;
}
但此题的标准解法是扩展欧拉定理。而且效率高于快速幂加指数分解。扩展欧拉定理后续再介绍。