矩陣快速冪總結
阿新 • • 發佈:2020-07-28
快速冪一般都是用來快速遞推某個矩陣的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; } }
記錄一次快速冪