算法老师的第一题
快速幂用 for循环来的too late
所以用这个公式
a^b mod c == (a mod c)^b mod c
#include <stdio.h>
int Power(int, int);
const int MOD = 10007;
int main()
{
int N, k;
scanf("%d%d", &N, &k);
printf("%d\n", Power(N, k));
return 0;
}
int Power(int a,int b){
int res=1;
a=a%MOD;
while(b>0){
if(b%2==1){ //b为奇数
res=res*a%MOD;
}
b/=2;
a=a*a%MOD;
}
return res;
}
重点内容
*以下讲解来自 CSDN Karen_YU_
顺便引用快速幂讲解
代码很短,死记也可行,但最好还是理解一下吧,其实也很好理解,以b==11为例,b=>1011,二进制从右向左算,但乘出来的顺序是 a^(2^0)a^(2^1)*a^(2^3),是从左向右的。我们不断的让base=base目的即是累乘,以便随时对ans做出贡献。
其中要理解base*=base这一步:因为 base*base==base2,下一步再乘,就是base2*base2==base4,然后同理 base4*base4=base8,由此可以做到base–>base2–>base4–>base8–>base16–>base32…….指数正是 2^i ,再看上面的例子,a¹¹= a1*a2*a8,这三项就可以完美解决了,快速幂就是这样。
顺便啰嗦一句,由于指数函数是爆炸增长的函数,所以很有可能会爆掉int的范围,根据题意选择 long long还是mod某个数自己看着办。*
2^11=2^1 * 2^2 * 2^8