一個我自己寫的矩陣快速冪模板
阿新 • • 發佈:2019-02-13
/* n階方形矩陣快速冪模板,如果m*n的矩陣可以考慮將m,n存入結構體matrix中 函式分為3個,分別是矩陣相乘,轉化單位矩陣,快速冪。 測試結果 AC BY SHU_ONISAC */ #include<iostream> #include<cstring> using namespace std; struct matrix{ long long a[15][15]; }; matrix matrix_muti(matrix a,matrix b,int n)//矩陣相乘(這個只要注意i,j,k的順序就行了) { matrix c; memset(c.a,0,sizeof(c.a)); for(int i=0;i<n;++i) for(int j=0;j<n;++j) for(int k=0;k<n;++k){ c.a[i][j]+=a.a[i][k]*b.a[k][j]; } return c; } matrix init(matrix r,int n)//轉化單位矩陣 { for(int i=0;i<n;++i){ for(int j=0;j<n;++j) r.a[i][j]=(i==j); } return r; } matrix fast_power(matrix a,int n,int k)//快速冪 { matrix r; r=init(r,n);//先將r.a化為單位矩陣 while(k){ if(k&1)r=matrix_muti(r,a,n); /*(k&1)與(k&2==1)是一個意思,就是矩陣相乘的時候如果冪次不是偶數, 要提出一個“因數”存在r內。又因為無論 k是奇數或者偶數,由於k=k>>1(相當於k=k/2), k最終一定會先變為1再變為0,所以最終結果可以存在r中。*/ a=matrix_muti(a,a,n); k=k>>1; } return r; } int main() { int n,k; matrix ori,ans; while(cin>>n>>k) { for(int i=0;i<n;++i)//將輸入的資料存在ori中 for(int j=0;j<n;++j) cin>>ori.a[i][j]; ans=fast_power(ori,n,k);//執行快速冪 for(int i=0;i<n;++i)//輸出結果 { for(int j=0;j<n;++j) { if(j<n-1)cout<<ans.a[i][j]<<' '; else cout<<ans.a[i][j]; } cout<<endl; } cout<<endl; } return 0; }