引例: Matrix Power Series

题目大意,给定矩阵A,求A^1+A^2+A^3+...A^N。

题解:已知X=a,可以通过以下矩阵求出ans=a^1+a^2+...a^N ans=矩阵^n后第一行之和-1=矩阵^(n+1)后右上格的和-1

同理:矩阵也可以,只需要把1改为单位矩阵元即可。

左图a是常数,1就是1; 右图A是矩阵,1是单位元矩阵(主对角线是1)。

【矩阵---求A的1到N次幂之和】          【矩阵---求A的1到N次幂之和】

 

代码1:矩阵^N,第一行之和-1。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=70;
int N,K,Mod;
struct mat
{
    int mp[maxn][maxn],len;
    mat(int x){ len=x; memset(mp,0,sizeof(mp)); }
    mat friend operator *(mat a,mat b)
    {
        mat res(a.len);
        for(int k=1;k<=res.len;k++)
         for(int i=1;i<=res.len;i++)
          for(int j=1;j<=res.len;j++)
            res.mp[i][j]=(res.mp[i][j]+a.mp[i][k]*b.mp[k][j])%Mod;
        return res;
    }
    mat friend operator ^(mat a,int x)
    {
        mat res(a.len);
        for(int i=1;i<=res.len;i++) res.mp[i][i]=1;
        while(x){
            if(x&1)res=res*a;  a=a*a;  x>>=1;
        }   return res;
    }
};
int main()
{
    scanf("%d%d%d",&N,&K,&Mod);
    mat array(N+N);
    for(int i=1;i<=N;i++)
      for(int j=1;j<=N;j++){ 
         scanf("%d",&array.mp[i][j]);
    } 
    for(int i=1;i<=N;i++) array.mp[i][i+N]=array.mp[i+N][i+N]=1;
    array=array^(K);
    for(int i=1;i<=N;i++) array.mp[i][i+N]-=1;
    for(int i=1;i<=N;i++){
        for(int j=1;j<N;j++)
           printf("%d ",(array.mp[i][j]+array.mp[i][j+N]+Mod)%Mod);
        printf("%d\n",(array.mp[i][N]+array.mp[i][N+N]+Mod)%Mod);
    }
    return 0;
}
View Code

相关文章: