快速求幂
能将a^b 的时间复杂度从O(n) 降到O(logn)
核心思想利用二进制
详细:http://www.cnblogs.com/CXCXCXC/p/4641812.html
小笔记: a&1 取a的二进制的最后一位
a>>=1 相当于 a/=2,也相当于去掉a的二进制的最后一位; >>= 改变a值 ; >>做运算 但不改变a值
a<<=1 相当于a*=2; <<= 改变a值 ; <<做运算 但不改变a值
a=1, a<<=n 相当于 pow(2,n);
#define ll long long
int poww(ll m,ll n)
{
ll b = 1;
while (n > 0)
{
if (n & 1)
b *= m;
n = n >> 1 ;
m *= m;
}
return b;
}
m^n mod k
#define ll long long
int quickpow(ll m,ll n,ll k)
{
ll b = 1;
if(n==0)
return 1%k;
while (n > 0)
{
if (n & 1)
b = (b*m)%k;
n = n >> 1 ;
m = (m*m)%k;
}
return b;
}