Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3+ … + Ak.
Input
The input contains exactly one test case. The first line of input contains three positive integers n (n ≤ 30), k (k ≤ 109) and m (m < 104). Then follow n lines each containing n nonnegative integers below 32,768, giving A’s elements in row-major order.
Output
Output the elements of S modulo m in the same way as A is given.
Sample Input
2 2 4
0 1
1 1
Sample Output
1 2
2 3
题意理解:读题意可知,该题是一个递推求解的题,k最大可以达到1e9,那么考虑用矩阵快速幂求解。先要确定这初始矩阵是
,再根据递推式,得到状态转移矩阵是,这样我们就可以通过状态转移矩阵的n-1次方再乘以初始矩阵就是我们所要求的目标矩阵,因为我选用的初始矩阵是,所以状态转移矩阵就需要n-1次方,如果初始矩阵不同,那么转移矩阵所需要转移的次数也会不同。而通过这题,我们可以非常明显的看到在运用矩阵快速幂的时候,我们需要确定的有两个量,一个是初始矩阵,另一个是状态转移矩阵,而使用矩阵快速幂,使状态转移矩阵转移的更快。
关于代码,矩阵相乘非常好写,而矩阵快速幂就是在快速幂的基础上将数的相乘转换为了矩阵相乘,也是相当容易的。但这题也需要注意取模,一开始数据输入时就要取模。
代码:
#include <iostream>
#include <cstring>
#define ll long long
using namespace std;
ll N, Mod;
struct Matrix
{
int m[61][61];
};
Matrix multi(Matrix a, Matrix b)
{
Matrix ans;
memset(ans.m, 0, sizeof(ans.m));
for(int i = 1; i <= N; i++)
for(int j = 1; j <= N; j++)
for(int k = 1; k <= N; k++)
ans.m[i][j] = (ans.m[i][j] + a.m[i][k]*b.m[k][j] % Mod) % Mod;
return ans;
}
Matrix pow(Matrix a, ll n)
{
Matrix ans;
memset(ans.m, 0, sizeof(ans.m));
for(int i = 1; i <= N; i++)
ans.m[i][i] = 1;
while(n)
{
if(n&1)
ans = multi(ans, a);
n >>= 1;
a = multi(a, a);
}
return ans;
}
int main()
{
Matrix ans, T;
ll n, k, data;
cin >> n >> k >> Mod;
N = n*2;
memset(ans.m, 0, sizeof(ans.m));
memset(T.m, 0, sizeof(T.m));
for(int i = 1; i <= n; i++)
{
ans.m[i][i] = 1;
}
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
{
cin >> data;
ans.m[i][j+n] = data % Mod;
ans.m[i+n][j+n] = data % Mod;
T.m[i][j] = data % Mod;
T.m[i+n][j] = data % Mod;
}
// for(int i = 1; i <= N; i++)
// {
// for(int j = 1; j < N; j++)
// {
// cout << T.m[i][j]<< ' ';
// }
// cout << T.m[i][N] << endl;
// }
ans = pow(ans, k-1);
ans = multi(ans, T);
for(int i = 1; i <= n; i++)
{
for(int j = 1; j < n; j++)
{
cout << ans.m[i][j]<< ' ';
}
cout << ans.m[i][n] << endl;
}
return 0;
}