题目的意思:计算矩阵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