[矩陣快速冪]hdu1575 Tr A
阿新 • • 發佈:2019-02-13
hdu1575
Tr A
題意:
求矩陣A的k次冪,主對角線之和%9973
思路:
裸的矩陣快速冪,具體見模板
程式碼:
/************************************************************** Problem: HDU_1575 User: soundwave Language: C++ Result: Accepted Time: 0ms Memory: 1576KB ****************************************************************/ //#pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <stdio.h> #include <vector> using namespace std; typedef vector<int> Vint; typedef vector<Vint> VVint; typedef __int64 LL; const int MOD = 9973; //矩陣乘法 VVint calc(VVint &A, VVint &B){ VVint C(A.size(),Vint(A.size())); for(int i=0; i<A.size(); i++) for(int j=0; j<B[0].size(); j++) for(int k=0; k<B.size(); k++) C[i][j] = (C[i][j] + (A[i][k]*B[k][j])) % MOD; return C; } //二分快速冪 VVint my_pow(VVint &A, int c){ VVint B(A.size(),Vint(A.size())); for(int i=0; i<A.size(); i++) B[i][i] = 1; if(c==1) return A; while(c>0){ if(c&1) B = calc(B,A); A = calc(A,A); c>>=1; } return B; } int main(){ int t, n, k; scanf("%d", &t); while(t-->0){ scanf("%d%d", &n, &k); VVint A(n,Vint(n)); for(int i=0; i<n; i++) for(int j=0; j<n; j++) scanf("%d", &A[i][j]); A = my_pow(A,k); LL re=0; for(int i=0; i<n; i++) re += A[i][i]; printf("%I64d\n", re%MOD); } return 0; }