1142 - Summing up Powers (II)
题意:给定
n×n
的矩阵
A
和一个数
∑i=1kAi=A1+A2+A3+...+Ak
题解:
令 B=[AOAE] ,其中 E 表示单位矩阵。
存在如下关系:
构造出B矩阵快速幂,最后取右上矩阵即可。
#include<stdio.h>
#include<string.h>
const int mod = 10;
inline void cm(int &x){ if(x >= mod) x %= mod; }
struct mat{
int sz, r[70][70];
mat(int _sz){ sz = _sz; memset(r, 0, sizeof(r)); }
mat operator * (mat a){
mat res = mat(sz);
for(int i = 0; i < sz; ++i){
for(int j = 0; j < sz ; ++j){
for(int k = 0; k < sz; ++k){
res.r[i][j] += r[i][k] * a.r[k][j];
cm(res.r[i][j]);
}
}
}
return res;
}
};
mat getB(int n){
mat res = mat(n*2);
for(int i = 0; i < n; ++i){
for(int j = 0; j < n; ++j){
scanf("%d", &res.r[i][j]);
res.r[i][j+n] = res.r[i][j];
}
res.r[i+n][i+n] = 1;
}
return res;
}
mat matpow(int n, int k){
mat b = getB(n);
mat res = mat(b.sz);
for(int i = 0; i < res.sz; ++i) res.r[i][i] = 1;
while(k){
if(k&1) res = res*b;
b = b*b;
k >>= 1;
}
return res;
}
int main(){
int T, ca = 1;
scanf("%d", &T);
while(T--){
int n, k;
scanf("%d%d", &n, &k);
mat ans = matpow(n, k);
printf("Case %d:\n", ca++);
for(int i = 0; i < n; ++i){
for(int j = n; j < n*2; ++j){
putchar(ans.r[i][j]+'0');
}
putchar('\n');
}
}
}