Matrix Power Series
Time Limit: 3000MS | | Memory Limit: 131072K |
Total Submissions: 16512 | | Accepted: 7035 |
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 4 0 1 1 1
Sample Output
1 2 2 3
Source
POJ Monthly--2007.06.03, Huang, Jinsong
这个求的是1~k次幂的A矩阵的相加即s矩阵等于S = A + A2 + A3 + … + Ak.,需要用到递归
- Source Code
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
struct node
{
int mp[32][32];
}init,res;
int n,mod,kk;
struct node add(struct node a,struct node b)
{
struct node c;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
c.mp[i][j] = 0;
c.mp[i][j] = a.mp[i][j] + b.mp[i][j];
c.mp[i][j] = c.mp[i][j]%mod;
}
}
return c;
};
struct node mult(struct node a,struct node b)
{
struct node c;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
c.mp[i][j] = 0;
for(int k=0;k<n;k++)
{
c.mp[i][j] += a.mp[i][k] * b.mp[k][j];
c.mp[i][j] %= mod;
}
}
}
return c;
};
struct node Cal(int k)
{
struct node tmp = res,x = init;
while(k)
{
if(k%2 == 1)
{
tmp = mult(tmp,x);
}
x = mult(x,x);
k>>=1;
}
return tmp;
};
struct node sum(int k)
{
if(k == 1)
{
return init;
}
struct node tmp,tnow;
tmp = sum(k/2);
if(k%2 == 1)
{
tnow = Cal(k/2+1);
tmp = add(tmp,mult(tmp,tnow));
tmp = add(tnow,tmp);
}
else
{
tnow = Cal(k/2);
tmp = add(tmp,mult(tmp,tnow));
}
return tmp;
};
int main()
{
int k;
scanf("%d%d%d",&n,&kk,&mod);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&init.mp[i][j]);
init.mp[i][j]%=mod;
if(i == j)
{
res.mp[i][j] = 1;
}
else
{
res.mp[i][j] = 0;
}
}
}
struct node tt;
tt = sum(kk);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(j == 0)
{
printf("%d",tt.mp[i][j]);
}
else
{
printf(" %d",tt.mp[i][j]);
}
}
printf("\n");
}
return 0;
}