zoukankan      html  css  js  c++  java
  • poj 3323 Matrix Power Series (矩阵乘法 非递归形式)

    为了搞自动机+矩阵的题目,特来学习矩阵快速幂..........非递归形式的求Sum(A+A^2+...+A^k)不是很懂,继续弄懂................不过代码简洁明了很多,亮神很给力


    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <string>
    #include <vector>
    #include <set>
    #include <queue>
    #include <stack>
    #include <climits>//形如INT_MAX一类的
    #define MAX 100005
    #define INF 0x7FFFFFFF
    #define REP(i,s,t) for(int i=(s);i<=(t);++i)
    #define LL long long
    #define mem(a,b) memset(a,b,sizeof(a))
    #define mp(a,b) make_pair(a,b)
    #define L(x) x << 1
    #define R(x) x << 1 | 1
    # define eps 1e-5
    //#pragma comment(linker, "/STACK:36777216") ///传说中的外挂
    using namespace std;
    int n,k,m;
    __int64 a[33][33];
    __int64 x[66][66],y[66][66];
    
    void multi(__int64 x[66][66],__int64 y[66][66]) { // A * B
        __int64 p[66][66];
        memset(p,0,sizeof(p));
        int N = n * 2;
        for(int i=0; i<N; i++) {
            for(int j=0; j<N; j++) {
                for(int k=0; k<N; k++) {
                    p[i][j] = (p[i][j] + (x[i][k] * y[k][j]) % m) % m;
                }
            }
        }
        for(int i=0; i<N; i++) {
            for(int j=0; j<N; j++) {
                x[i][j] = p[i][j];
            }
        }
    }
    
    void quickmul(int p) { //将矩阵扩大成2n * 2n
        for(int i=0; i<n; i++) {
            for(int j=0; j<n; j++) {
                y[i+n][j+n] = a[i][j];
                x[i][j+n] = a[i][j];
            }
        }
        for(int i=0; i<n; i++) y[i][i] = 1;
        for(int i=0; i<n; i++) y[i+n][i] = 1;
        while(p) {  //A ^ p
            if(p & 1) {
                multi(x,y);
            }
            multi(y,y);
            p = p >> 1;
        }
    }
    
    int main() {
        scanf("%d%d%d",&n,&k,&m);
        for(int i=0; i<n; i++) {
            for(int j=0; j<n; j++) {
                scanf("%d",&a[i][j]);
                a[i][j] %= m;
            }
        }
        memset(x,0,sizeof(x));
        memset(y,0,sizeof(y));
        quickmul(k);
        for(int i=0; i<n; i++) {
            printf("%d",x[i][0]);
            for(int j=1; j<n; j++) printf(" %d",x[i][j]);
            puts("");
        }
        return 0;
    }
    


  • 相关阅读:
    CodeForces
    EOJ 3506. 斐波那契数列
    牛客练习赛13 D幸运数字Ⅳ . 康托逆展开
    UVA
    Piggy-Bank HDU
    Dollar Dayz POJ
    UVA 674 Coin Change (完全背包)
    python OOP (1)
    python lambda简易使用
    python whl模块安装方法
  • 原文地址:https://www.cnblogs.com/james1207/p/3290077.html
Copyright © 2011-2022 走看看