小易拥有一个拥有魔力的手环上面有n个数字(构成一个环),当这个魔力手环每次使用魔力的时候就会发生一种奇特的变化:每个数字会变成自己跟后面一个数字的和(最后一个数字的后面一个数字是第一个),一旦某个位置的数字大于等于100就马上对100取模(比如某个位置变为103,就会自动变为3).现在给出这个魔力手环的构成,请你计算出使用k次魔力之后魔力手环的状态。
#include <bits/stdc++.h>
using namespace std;
class Matrix {
public:
int n, m;
vector<vector<int>> mat;
Matrix(vector<int>& vec) {
n = 1;
m = vec.size();
mat.emplace_back(vec);
}
Matrix(int n, int m) : n(n), m(m) {
mat.resize(n, vector<int>(m, 0));
}
Matrix(int n = 0) : n(n), m(n) {
//构造矩阵B
mat.resize(n, vector<int>(m, 0));
for (int i = 0; i < n; ++i) {
mat[i][i] = 1;
if (i + 1 < n)
mat[i+1][i] = 1;
else
mat[0][i] = 1;
}
}
Matrix& operator * (Matrix& b) {
Matrix temp(this->n, b.m);
if (this->m == b.n) {
for (int i = 0; i < temp.n; ++i) {
for (int j = 0; j < temp.m; ++j) {
for (int k = 0; k < m; ++k) {
temp.mat[i][j] += this->mat[i][k] * b.mat[k][j];
}
}
}
}
*this = temp;
return *this;
}
Matrix& operator % (int k) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
this->mat[i][j] %= k;
}
}
return *this;
}
void display() {
for (int i = 0; i < n - 1; ++i) {
for (int j = 0; j < m - 1; ++j) {
cout << mat[i][j] << " ";
}
cout << mat[i][m-1] << endl;
}
for (int i = 0; i < m - 1; ++i) {
cout << mat[n-1][i] << " ";
}
cout << mat[n-1][m-1] << endl;
}
};
int main() {
int n, k;
while (cin >> n >> k) {
vector<int> vecs(n);
for (int i = 0; i < n; ++i) {
cin >> vecs[i];
}
Matrix ans(vecs);
Matrix mul(n);
while (k != 0) {
//快速幂求余算法
if (k & 1) {
ans = ans * mul % 100;
}
mul = mul * mul % 100;
k >>= 1;
}
ans.display();
}
return 0;
}
/*intput
7 192347
3 15 7 1 16 1 72
output
88 72 62 55 11 11 21
*/