1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| #include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 10 + 5; const ll mod = 9973;
struct Matrix { int n, m; ll a[maxn][maxn]; Matrix(int n = 0, int m = 0) : n(n), m(m) {} void input() { for(int i = 1; i <= n; ++i) { for(int j = 1; j <= n; ++j) { scanf("%lld", &a[i][j]); } } } void output() { for(int i = 1; i <= n; ++i) { for(int j = 1; j <= n; ++j) { printf("%lld", a[i][j]); printf("%s", j == n? "\n": " "); } } } void init() { memset(a, 0, sizeof(a)); } void unit() { if(n == m) { init(); for(int i = 1; i <= n; ++i) { a[i][i] = 1; } } } Matrix operator *(const Matrix b) { Matrix c(n, b.m); c.init(); for(int i = 1; i <= c.n; ++i) { for(int k = 1; k <= m; ++k) { for(int j = 1; j <= c.m; ++j) { c.a[i][j] = (c.a[i][j] + a[i][k] * b.a[k][j]) % mod; } } } return c; } Matrix qmod(ll b) { if(n == m) { Matrix a = *this; Matrix ans = Matrix(n, n); ans.unit(); if(!b) return ans; while(b) { if(b & 1) ans = ans * a; a = a * a; b >>= 1; } return ans; } } };
int main() { int T; scanf("%d", &T); while(T--) { int n; ll k; scanf("%d%lld", &n, &k); Matrix m(n, n); m.input(); m = m.qmod(k); ll ans = 0; for(int i = 1; i <= n; ++i) { ans = (ans + m.a[i][i]) % mod; } printf("%lld\n", ans); } return 0; }
|