poj3233(Matrix Power Series)快速幂

Description

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

题意:给定矩阵A,求 S = A + A2 + A3 + … + Ak


题解:设S = I + A + A2 + A3 + … + Ak-1

则

快速幂计算即可


#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <map>
#include <vector>
#include <list>
#include <set>
#include <stack>
#include <queue>
#include <deque>
#include <algorithm>
#include <functional>
#include <numeric>
#include <iomanip>
#include <limits>
#include <new>
#include <utility>
#include <iterator>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <ctime>
using namespace std;

typedef vector<int> vec;
typedef vector<vec> mat;

int n, k, m;

mat mul(mat& a, mat& b)
{
    mat c(2*n, vec(2*n));
    for (int i = 0; i < 2*n; ++i)
        for (int k = 0; k < 2*n; ++k)
            for (int j = 0; j < 2*n; ++j)
                c[i][j] = (c[i][j] + a[i][k] * b[k][j]) % m;
    return c;

}

mat pow(mat& a, int k)
{
    mat b(2*n, vec(2*n));
    for (int i = 0; i < 2*n; ++i)
        b[i][i] = 1;
    while (k > 0)
    {
        if (k&1)
            b = mul(b, a);
        a = mul(a, a);
        k >>= 1;
    }
    return b;
}

int main()
{
    cin >> n >> k >> m;
    mat A(2*n, vec(2*n));
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < n; ++j)
            scanf("%d", &A[i][j]);
        A[n+i][i] = A[n+i][n+i] = 1;
    }
    A = pow(A, k+1);
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j)
        {
            int a = A[n+i][j] % m;
            if (i == j)
                a = (a + m - 1) % m;
            printf("%d%c", a, j+1==n?'
':' ');
        }
    return 0;
}



原文地址:https://www.cnblogs.com/godweiyang/p/12203940.html