问题:求(x^n)%mod (n<10^9)
模板:
code_1:
ll mod_pow(ll x, ll n, ll mod)
{
ll res = 1;
while(n > 0)
{
if(n & 1) res = res*x%mod; //如果二进制最低位为1,则乘上x^(2^i)
x = x*x%mod; //将x平方
n >>= 1;
}
return res;
}
code_2:
/*也可以这样理解:当n为偶数时有x^n = ((x^2)^(n/2)),
递归转为n/2的情况。n为奇数时有x^n = ((x^2)^(n/2))*x,
同样也递归转为n/2的情况。这样不断递归下去,每次n都减半,
于是可以在O(logn)时间内完成幂运算。
*/
#include<stdio.h>
typedef long long ll;
ll mod_pow(ll x, ll n, ll mod)
{
if(n==0) return 1;
ll res = mod_pow(x*x%mod, n/2, mod);
if(n & 1) res = res*x%mod;
return res;
}