矩阵快速幂
乘法快速幂
代码
java
// 二进制拆分 + 倍增思想
// 5 的 二进制 101 , 2 ^ 5 = 2 ^ 4 * 2;
int quickpow(int a , int n) {
int res =1 ;
while(n>0) {
if((n&1) ==1) {
res*=a;
}
a = a*a;
n>>=1;
}
return res;
}
矩阵快速幂
只要状态转移是线性的,就能写成矩阵乘法。
代码
java
/**
* 矩阵乘法
* @param a int[][]
* @param b int[][]
* @return ans int[][]
*/
public static int[][] multiply(int[][]a,int[][]b){
int n = a.length;
int m = b[0].length;
int k = a[0].length;
int [][] ans = new int[n][m];
for(int i =0;i<n;i++){
for(int j =0;j<m;j++){
for(int c =0;c<k;c++){
ans[i][j] += a[i][c] * b[c][j];
}
}
}
return ans;
}
/**
* 矩阵快速幂
* @param matrix int[][] 必须是方阵
* @param k int
* @return int[][]
*/
public static int[][] matrixPower(int[][] matrix, int k) {
int n = matrix.length;
int[][] res = new int[n][n];
// 1.初始化单位矩阵
for (int i = 0; i < n; i++) {
res[i][i] = 1;
}
// 2. 快速幂计算
while (k > 0) {
if ((k & 1) == 1) {
res = multiply(res, matrix);
}
matrix = multiply(matrix, matrix);
k >>= 1;
}
return res;
}