模板-矩陣快速冪
阿新 • • 發佈:2018-11-11
不難,比dfs啊,dp啊,簡單多了。
https://www.luogu.org/problemnew/solution/P3390
#include<iostream> #include<cstring> #define mod 1000000007 #define ll long long using namespace std; struct Mat{ ll m[101][101]; };//結構體存矩陣 Mat a,e;//a是輸入的矩陣,e是單位矩陣 ll n,p; Mat Mul(Mat x,Mat y) //矩陣乘 { Mat c; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) c.m[i][j]=0; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) { c.m[i][j]=c.m[i][j]%mod+x.m[i][k]*y.m[k][j]%mod; } return c; } Mat pow(Mat x,ll y) //矩陣快速冪 { Mat ans=e; while(y) { if(y&1) ans=Mul(ans,x); x=Mul(x,x); y>>=1; } return ans; } int main() { //輸入 cin>>n>>p; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>a.m[i][j]; //演算法核心 for(int i=1;i<=n;i++) e.m[i][i]=1; Mat ans=pow(a,p); //輸出 for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) cout<<ans.m[i][j]%mod<<" "; cout<<endl; } return 0; }