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;
}