zoukankan      html  css  js  c++  java
  • 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;
    }
    



  • 相关阅读:
    js外观模式
    微服务架构的基础框架选择:Spring Cloud还是Dubbo?
    JAVA 中BIO,NIO,AIO的理解
    Reactor和Proactor模式的讲解(关于异步,同步,阻塞与非阻塞)
    JVM(Java虚拟机)优化大全和案例实战
    php编译安装后,加扩展模块
    mysql查所有列名
    cannot get uid for user 'www'
    rabbitmq management Login Failed
    nginx 安装过程中的not found
  • 原文地址:https://www.cnblogs.com/godweiyang/p/12203940.html
Copyright © 2011-2022 走看看