矩阵快速幂
矩阵快速幂
快速幂: 快速计算一个数的的几次方,例如 2^75, 75 = (1001011),只需要计算2^64 * 2^8 * 2^2 * 2^1
代码:
long long fast_power(int a,int b,int mod){
long long ans = 1;
ans %= mod;
while(b > 0){
if(b&1)ans = (ans * a) % mod;
a = (a*a)%mod;
b >>= 1;
}
return ans;
}
矩阵乘法: 如果矩阵m1的行为n,列为k,矩阵m2的行为k,列为m,那么这两个矩阵可以相乘得到一个n * m的矩阵
代码:
vector<vector<int>> multify(vector<vector<int>>&m1,vector<vector<int>>&m2){
int n = m1.size();
int k = m1[0].size();
int m = m2[0].size();
vector<vector<int>>m3(n,vector<int>(m));
for(int i = 0;i<n;i++){
for(int j = 0;j<m;j++){
for(int t = 0;t<k;t++){
int res = 0;
res += m1[i][t] * m2[t][j];
}
m3[i][j] = res;
}
}
return m3;
}
矩阵快速幂: 和普通的快速幂基本一样,只是乘法换成了矩阵乘法
代码:
vector<vector<int>>power(int n,vector<vector<int>>mx){
vector<vector<int>>ans = {
{1,0},
{0,1}
};
while(n > 0){
if(n&1)ans = multify(ans,mx);
mx = multify(mx,mx);
n >>= 1;
}
return ans;
}
浙公网安备 33010602011771号