Hdu 1575 Tr A 矩陣快速冪模板
阿新 • • 發佈:2018-12-15
Problem Description
A為一個方陣,則Tr A表示A的跡(就是主對角線上各項的和),現要求Tr(A^k)%9973。
Input
資料的第一行是一個T,表示有T組資料。
每組資料的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)兩個資料。接下來有n行,每行有n個數據,每個資料的範圍是[0,9],表示方陣A的內容。
Output
對應每組資料,輸出Tr(A^k)%9973。
Sample Input
2
2 2
1 0
0 1
3 99999999
1 2 3
4 5 6
7 8 9
Sample Output
2
2686
套用矩陣快速冪的模板即可.....
程式碼如下:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; typedef long long ll; const int maxn=15; const int mod=9973; struct mat { ll a[maxn][maxn]; }; int t; int n,k; mat m; mat mul (mat a,mat b) { mat c; for (int i=0;i<n;i++) { for (int j=0;j<n;j++) { c.a[i][j]=0; for (int k=0;k<n;k++) { c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j]%mod)%mod; } //c[i][j]=x; } } return c; } mat Fast (mat a,int b) { mat c; memset (c.a,0,sizeof(c.a)); for (int i=0;i<n;i++) { c.a[i][i]=1; } while (b) { if(b&1) { c=mul(c,a); } a=mul(a,a); b>>=1; } return c; } int main() { 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("%lld",&m.a[i][j]); mat ans=Fast(m,k); ll sum=0; for (int i=0;i<n;i++) sum=(sum+ans.a[i][i])%mod; printf("%lld\n",sum); } return 0; }