快速幂
problem:
计算
a^b的值
啊哈哈,这不有手就行么,简单入门红题,跑个循环不就出来了嘛——土蛋
可数据毒瘤小k,给出了下面一个数据
\(a = 2^{31}\) , b = \(2^{31}\)
土蛋疯了,于是去加工修炼,终于练就快速幂本领,击败了了毒瘤小k
快速幂
思路:
举个例子:
\(2^{15}\)
step1.ans = \(15\) 个 \(2\) 相乘.
step2.ans = \(7\) 个 \(4\) 相乘再乘上一个 \(2\).
step3.ans = \(3\) 个 \(16\) 相乘再乘上 \(2*4\).
step4.ans = \(1\) 个 \(256\) 乘上 \(2*4*16\).
从以上的步骤中不难看出,当我们求一个数的n次幂的时候,我们可以将它的两两进行配对相乘,
如果有多出来的一个数,则将它乘到答案中,否则继续配对,直到只剩下一个数为止。
有一个小的注意事项,对答案进行初始化时,初始值应为1而不是0.
结合代码更加理解
int power(int a,int b){
int ans = 1;
while(b > 0){
if(b % 2 == 1)
ans = (ans * a) % mod;
a = (a * a) % mod;
b = b >> 1;
}
return ans;
}