【快速幂】理解
记录一下当时是怎么理解的,以备后面忘记可以回顾。
快速幂
普通求 ab, 就是让aaa…乘b次,时间复杂度为O(n)…
快速幂 能快到O(log n).. 原理是
比如 a5。 5 二进制为 0101;a5=a^ (2^ 01 +2^10 +2 ^2*1) ;
5 = 20*1 +21*0 +2 2*1
a^5^= a^ 2^0^*1 * a^ 2^1^*0 * a^2 ^2^*1 ;
代码如下:
int mod(int a,int b){
int res =1;
while(b>0){ //a为数 b为幂 (a^b例如是2^5)
if(b & 1){ //b &1 为取b的二进制的最后一位(右到左)
res = res *a; //如果是1,则让它乘上当前a
}
a = a*a; //a*a =a^2,表示下次二进制走到第二位时a的值
// 对应二进制四位0000 a->a^2->a^4->a^8
b>>=1; //二进制右移一位,倒数第二个现在是倒是第一个,然后重复while
}
return res;
}
一般用到快速幂的情况, 有些算法题 时间限制,取模题 相乘超过long long 等。。
tepedef long long ll;
ll res=1;
while(b>0){
if(b & 1){
res = res *a%n; //取模题 这样不会超long范围
}
a = a*a%n;
b>>=1;
}
return res;
}
矩阵快速幂
再补
快速乘
快速乘 和 基本快速幂一样用法
比如 a5 = a201 + a210 + a22*1
int pow_mul(int a,int b){
int res = 0; //为0,
while(b>0){
if(b & 1){
res = (res + a); //相加
}
a = a+a; //相加 2a->4a->8a;
b >>= 1;
}
return res;
}