1. 程式人生 > 實用技巧 >矩陣快速冪總結

矩陣快速冪總結

快速冪一般都是用來快速遞推某個矩陣的n次冪的,一些題目的解法可以通過找規律遞推,構建遞推矩陣,就可以進行高次計算。

模板自用:

#include <iostream>
#include <vector>
using namespace std;

vector<vector<unsigned long long>> mul(vector<vector<unsigned long long>> a,vector<vector<unsigned long long>> b){
    int n=a.size();
    
int s=a[0].size(); int m=b[0].size(); vector<vector<unsigned long long>> c(n,vector<unsigned long long>(m,0)); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ for(int k=0;k<s;k++){ c[i][j]+=a[i][k]*b[k][j]; } } }
return c; } vector<vector<unsigned long long>> qmi1(vector<vector<unsigned long long>> a,int k){ int n=a.size(); vector<vector<unsigned long long>> res(n,vector<unsigned long long>(n,0)); for(int i=0;i<n;i++){ res[i][i]=1; } while
(k){ if(k&1)res=mul(res,a); a=mul(a,a); k>>=1; } return res; } unsigned long long qmi2(unsigned long long a,unsigned long long k){ unsigned long long res=1; while(k){ if(k&1)res=res*1ull*a; a=a*1ull*a; k>>=1; } return res; } void out(vector<vector<unsigned long long>> a){ for(int i=0;i<a.size();i++){ for(int j=0;j<a[0].size();j++){ cout<<a[i][j]<<" "; } cout<<endl; } }

記錄一次快速冪