poj 3233 Matrix Power Series(矩阵里面的元素也是矩阵)

来源:互联网 发布:ubuntu 聊天工具 编辑:程序博客网 时间:2024/05/20 23:07

Matrix Power Series
Time Limit: 3000MS Memory Limit: 131072KTotal Submissions: 22895 Accepted: 9544

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 40 11 1

Sample Output

1 22 3

这个题通过观察很容易看出一个式子 S[k]=A+A*S[k-1]

由此可以推出

  S[k-1] 1 *  A 0 = S[k] 1 (1表示单位矩阵 任何矩阵乘单位矩阵为本身)

A 1

虽然 A是 矩阵但是没关系

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<algorithm>#include<map>#include<queue>#include<math.h>#include<vector>#include<iostream>using namespace std;typedef long long ll;ll n,mod,k;struct node1  //矩阵里面的矩阵{    ll a[31][31];    node1()    {        memset(a,0,sizeof(a));    }};node1 operator *(node1 a,node1 b){    node1 ans;    for(int i=0;i<n;i++)        for(int j=0;j<n;j++)        {            for(int k=0;k<n;k++)                ans.a[i][j]=ans.a[i][j]+a.a[i][k]*b.a[k][j];            ans.a[i][j]=ans.a[i][j]%mod;        }    return ans;}node1 operator +(node1 a,node1 b){    node1 ans;    for(int i=0;i<n;i++)        for(int j=0;j<n;j++)           ans.a[i][j]=a.a[i][j]+b.a[i][j];        return ans;}struct node2{    node1 b[2][2]; }A,B;node2 operator *(node2 a,node2 b){     node2 ans;    for(int i=0;i<2;i++)        for(int j=0;j<2;j++)            for(int k=0;k<2;k++)                ans.b[i][j]=ans.b[i][j]+a.b[i][k]*b.b[k][j];    return ans;}void aa(ll x){  node2 ans=A,p=B;  while(x)  {      if(x&1)        ans=ans*p;      p=p*p;      x=x/2;  }  for(int i=0;i<n;i++)  {      for(int j=0;j<n;j++)      {          printf("%lld",(ans.b[0][0].a[i][j]%mod+mod)%mod);          if(j!=n-1)            printf(" ");      }      printf("\n");  }}int main(){    scanf("%lld%lld%lld",&n,&k,&mod);    for(int i=0;i<n;i++)        for(int j=0;j<n;j++)          scanf("%lld",&A.b[0][0].a[i][j]);     for(int i=0;i<n;i++)        for(int j=0;j<n;j++)        {            if(i==j)             A.b[0][1].a[i][j]=1;            else             A.b[0][1].a[i][j]=0;        }     for(int i=0;i<n;i++)        for(int j=0;j<n;j++)        {            B.b[0][0].a[i][j]=A.b[0][0].a[i][j];            B.b[1][0].a[i][j]=A.b[0][0].a[i][j];            B.b[0][1].a[i][j]=0;            if(i==j)             B.b[1][1].a[i][j]=1;            else             B.b[1][1].a[i][j]=0;        }     aa(k-1);}





原创粉丝点击