题目的意思:计算矩阵S = A + A^2 + A^3 + ..... + A^k。A为n*n的矩阵。
一个一个计算,然后相加,由于k最大为10^9,所以会超时。
可以令S(k) = I + A + A^2 + ....+ A^(k-1).
可以推出:S(k) = S(k - 1) + A^(k - 1)。
进一步推出:
矩阵 I 为
(I的大小随n的变化而变化)
下面的是AC的代码:
#include <iostream>
#include <vector>
using namespace std;
typedef vector<int>vec;
typedef vector<vec>mat;
int n, k, m;
mat a(31, vec(31));
mat mul(mat &A, mat &B) //矩阵相差
{
mat C(A.size(), vec(B[0].size()));
for(int i = 0; i < A.size(); i++)
for(int k = 0; k < B.size(); k++)
for(int j = 0; j < B[0].size(); j++)
C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % m;
return C;
}
mat pows(mat A, int x) //快速幂运算
{
mat B(A.size(), vec(A.size()));
for(int i = 0; i < A.size(); i++) // 初始化
B[i][i] = 1;
while(x > 0)
{
if(x & 1)
B = mul(B, A);
A = mul(A, A);
x >>= 1;
}
return B;
}
int main()
{
int i, j;
cin >> n >> k >> m;
{
mat B(n * 2, vec(n * 2));
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
scanf("%I64d", &a[i][j]);
B[i][j] = a[i][j];
}
B[n + i][i] = B[n + i][n + i] = 1;//初始化下面的I
}
B = pows(B, k + 1); //I + A + A^2 + .... + A^n
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
int b = B[n + i][j] % m;
if(i == j) //减掉I
b = (b + m - 1) % m;
cout << b;
j != n - 1 ? cout << ' ' : cout << endl;
}
}
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
北大ACM3233——Matrix Power Series
原文地址:http://blog.csdn.net/qq_25425023/article/details/47208603