快速幂问题
问题:计算以m为底,n为指数的幂
基本思路:
从指数出发,
若指数为偶数,那么m^n = (m * m)^(n/2);
若指数为奇数,那么m^n = (m * m)^((n-1))/2) * m;
*举个栗子:
3^10=(3 * 3) * (3*3) * (3 * 3) * (3 * 3) * (3 * 3);
=(3 * 3)^5 = 9^5
=(9 * 9)^((5-1)/2)9;
在编程时遇到判断一个数是否为奇数(偶数)时:
可以运用一个定理:一个数若为奇数,则其二进制形式最后一位数为1;
一个数若为偶数,则其二进制形式最后一位数为0;
那么我们将该数x&1,其结果为1,x为奇数;其结果为0,x为偶数;
具体实现时可以用移位运算来优化代码:
x除以2 :x>>=1;
x乘以2 :x<<=1;
易理解版
**long long kpow(long long down,long long top)
{
long long temp=1;
while(top>0)
{ //若指数为奇数
if(top%2==1)
{
temp=temp*down%mod;
top=(top-1)/2;
down=(down*down)%mod;
}
//若指数为偶数
else
{
top/=2;
down=(down*down)%mod;
}
}
return temp;
}**
精简版
**long long kpow(long long down,long long top)
{
long long result=1;
while(top>0)
{
if(top&1)
result=result*down%mod;
//当top为奇数时,(top-1)/2==top/2
top>>=1;
down=(down*down)%mod;
}
return result;
}**