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

    题意:给一个n*n的矩阵A,求k次幂之和 S = A + A2 + A3 + … + Ak

    思路:矩阵快速幂。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    typedef struct node
    {
        int matrix[55][55];
    }Matrix;
    Matrix a,sa,unit;
    int n,m,k,i,j;
    Matrix add(Matrix a,Matrix b)//矩阵加
    {
        Matrix c;
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                c.matrix[i][j]=a.matrix[i][j]+b.matrix[i][j];
                c.matrix[i][j]%=m;
            }
        }
        return c;
    }
    Matrix mul(Matrix a,Matrix b)//矩阵乘
    {
        Matrix c;
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                c.matrix[i][j]=0;
                for(int h=0;h<n;h++)
                {
                    c.matrix[i][j]=c.matrix[i][j]+a.matrix[i][h]*b.matrix[h][j];
                }
                c.matrix[i][j]%=m;
            }
        }
        return c;
    }
    Matrix cal(int e)//矩阵幂
    {
        Matrix p,q;
        p=a;q=unit;
        while(e!=1)
        {
            if(e&1)
            {
                e--;
                q=mul(p,q);
            }
            else
            {
                e/=2;
                p=mul(p,p);
            }
        }
        p=mul(p,q);
        return p;
    }
    Matrix sum(int k)//幂之和
    {
        if(k==1) return a;
        Matrix temp,tnow;
        temp=sum(k/2);
        if(k&1)
        {
            tnow=cal(k/2+1);
            temp=add(temp,mul(temp,tnow));
            temp=add(tnow,temp);
        }
        else
        {
            tnow=cal(k/2);
            temp=add(temp,mul(temp,tnow));
        }
        return temp;
    }
    int main()
    {
        int i,j,l;
        while(scanf("%d%d%d",&n,&k,&m)!=EOF)
        {
          for(i=0;i<n;i++)
          {
            for(j=0;j<n;j++)
            {
                scanf("%d",&a.matrix[i][j]);
                a.matrix[i][j]%=m;
                unit.matrix[i][j]=(i==j);//单位矩阵
            }
          }
          sa=sum(k);//幂为k的结果
          for(i=0;i<n;i++)
          {
            for(j=0;j<n-1;j++)
            {
                printf("%d ",sa.matrix[i][j]%m);//对m取模
            }
            printf("%d
    ",sa.matrix[i][n-1]%m);
          }
        }
        return 0;
    }
  • 相关阅读:
    七.贪心算法
    六。二叉树
    从git指定commit拉分支
    二分法
    mysql 解决生僻字,特殊字符插入失败
    MYSQL性能优化以及建议
    PDF快捷键
    GC 核心关注点都在这里
    R语言载入包时报错:Error: 程辑包‘survival’没有名字空间
    Centos buff/cache过高
  • 原文地址:https://www.cnblogs.com/dashuzhilin/p/4391871.html
Copyright © 2011-2022 走看看