• 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;
    }
    



  • 相关阅读:
    skimage的安装,scikit-image
    今天开始看看brpc-baidurpc
    Silk Mobile – 缩短移动应用的测试周期
    将Controller中的数据传递到View中显示
    常用排序算法总结(二) ---- 插入排序,快速排序
    关于二叉搜索树及三种树遍历的特点
    poj
    元数据(meta-data)
    《UNIX环境高级编程》笔记--文件访问权限和新文件、目录所有权
    UVA 674 Coin Change 换硬币 经典dp入门题
  • 原文地址:https://www.cnblogs.com/godweiyang/p/12203940.html
Copyright © 2020-2023  润新知