zoukankan      html  css  js  c++  java
  • poj 3233 Matrix Power Series 矩阵求和

    http://poj.org/problem?id=3233

    题解 矩阵快速幂+二分等比数列求和

    AC代码

    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    #include <stdlib.h>
    #include <iostream>
    #include <sstream>
    #include <algorithm>
    #include <string>
    #include <queue>
    #include <map>
    #include <vector>
    using namespace std;
    const int maxn = 35;
    const int inf = 0x3f3f3f3f,mod = 1000000007;
    const double epx = 1e-10;
    typedef long long ll;
    struct Matrix
    {
        int m[maxn][maxn];                             //有哪位大佬知道为什么数组开大了会  Runtime Error
    };
    Matrix A,I;
    int n,m,k;
    Matrix add(Matrix a,Matrix b)
    {
        Matrix c;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                c.m[i][j]=a.m[i][j]+b.m[i][j];
                c.m[i][j]%=m;
            }
        }
        return c;
    }
    Matrix multi(Matrix a,Matrix b)
    {
        Matrix c;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                c.m[i][j]=0;
                for(int k=0;k<n;k++)
                {
                    c.m[i][j]+=a.m[i][k]*b.m[k][j];
                }
                c.m[i][j]%=m;
            }
        }
        return c;
    }
    Matrix poww(Matrix a,int n)
    {
        Matrix ans=I;
        while(n>0)
        {
            if(n&1)
                ans=multi(ans,a);
            n=n>>1;
            a=multi(a,a);
        }
        return ans;
    }
    Matrix sum(Matrix a,int n)
    {
        if(n==1) return a;
        Matrix t=sum(a,n/2);
        if(n&1)
        {
            Matrix cur=poww(a,n/2+1);
            t=add(t,multi(t,cur));
            t=add(t,cur);
        }
        else
        {
            Matrix cur=poww(a,n/2);
            t=add(t,multi(t,cur));
        }
        return t;
    }
    int main()
    {
        cin>>n>>k>>m;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                cin>>A.m[i][j];
                A.m[i][j]%=m;
                I.m[i][j]=(i==j);
            }
        }
        Matrix ans=sum(A,k);
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                cout<<ans.m[i][j]<<" ";
            }
            cout<<endl;
        }
        return 0;
    }
  • 相关阅读:
    前端工程师们,这些干货让你开发效率加倍
    我的代码片段
    人生至少有一次为了自己的勇气而活
    美食篇之御桥小聚
    美食篇之好好对自己
    F
    Github 简明教程
    A
    完美字符串
    1222: FJ的字符串 [水题]
  • 原文地址:https://www.cnblogs.com/stranger-/p/9000706.html
Copyright © 2011-2022 走看看