トピックリンク:HDU 1575
問題の説明
Aは正方行列であり、TrはトレースAは現在Trの(A ^ K)%9973を必要としているA(すなわち、主対角線と全てである)で表されています。
入力
データの最初の行がTであり、Tがデータのセットを表します。
各データの最初の行は、N(2 <= N <= 10)、及びK(2 <= K <10 9 ^)は、2つのデータを有しています。次いで、n個の行が存在し、n個のデータを有する各列は、各データ範囲は、行列の内容を表す、[0,9]です。
出力
出力Trの(A ^ K)%9973に対応するデータの各セット。
サンプル入力
2
2 2
1 0
0 1
3 99999999
1 2 3
4 5 6
7 8 9
サンプル出力
2
2686
溶液
問題の意味
その場合は。
問題の解決策
高速電力行列
高速電力行列テンプレートのタイトル。
コード
#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;
}