矩陣快速冪 (hdu1575)
阿新 • • 發佈:2018-11-06
矩陣快速冪 和一般的整數快速冪 是非常相似的 首先會以下 一般的快速冪
int pow(int n,int k)
{
int ans=1;
while(k)
{
if(k&1)
ans*=n;
k>>=1;
n*=n;
}
return ans;
}
那麼現在運用優秀的推理能力 我們把上邊的乘法 換成 矩陣乘法 問題不就解決了嗎?
以下為程式碼(不一定能AC。。貌似有點小bug。。我留錯了版本。。不過這樣才更有意思不是嗎。。)
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int mod=9973; int n,k; struct matrix { int a[12][12]; }init,unit; matrix mul(matrix t1,matrix t2) { matrix ans; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { ans.a[i][j]=0; for(int k=0;k<n;k++) ans.a[i][j]=ans.a[i][j]+t1.a[i][k]*t2.a[k][i]; ans.a[i][j]%=mod; } } return ans; } matrix Pow(matrix a,matrix b,int n) { while(n) { if(n&1) b=mul(b,a); n>>=1; a=mul(a,a); } return b; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&k); for(int i=0; i<n; i++) for(int j=0; j<n; j++) { scanf("%d",&init.a[i][j]); unit.a[i][j]=init.a[i][j]; } matrix res=Pow(init,unit,k-1); int ans=0; for(int i=0; i<n; i++) ans=(ans+res.a[i][i])%mod; printf("%d\n",ans%mod); } return 0; }