Matrix Power Series
Time Limit: 3000MS Memory Limit: 131072K
Total Submissions: 26212 Accepted: 10784
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
Time Limit: 3000MS Memory Limit: 131072K
Total Submissions: 26212 Accepted: 10784
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
构造矩阵,a0(A,E),a1(0,E);
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<map>
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
using namespace std;
const int MAXN=100+10;
const int inf=0x3f3f3f3f3f;
const int mod=1000000007;
int n,k,m;
struct matrix{
ll x[33*3][33*3];
matrix(){
mem(x,0);
}
};
matrix mul(matrix a,matrix b){
matrix c;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
c.x[i][j]=((a.x[i][k]*b.x[k][j])%m+c.x[i][j])%m;
}
}
}
return c;
}
matrix add(matrix a,matrix b){
matrix c;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
c.x[i][j]=(a.x[i][j]+b.x[i][j])%m;
}
}
return c;
}
matrix kum(matrix a,int i){
matrix res;
for(int i=1;i<=n;i++) res.x[i][i]=1;
while(i){
if(i&1){
res=mul(res,a);}
i>>=1;
a=mul(a,a);
}
return res;
}
int main(){
while(~scanf("%d%d%d",&n,&k,&m)){
matrix a;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
scanf("%d",&a.x[i][j]);
}
for(int i=1;i<=n;i++){
a.x[i][n+i]=1;
a.x[i+n][i+n]=1;
}
n*=2;
matrix ans;
ans=kum(a,k+1);
n/=2;
for(int i=1;i<=n;i++){
if(i==1)ans.x[1][n+1]-=1;
printf("%d",(ans.x[i][n+1]%m+m)%m);
for(int j=n+2;j<=2*n;j++){
if(i==j-n)ans.x[i][j]-=1;
printf(" %d",(ans.x[i][j]%m+m)%m);
}
printf("\n");
}
}
}
另一种做法
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<map>
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
using namespace std;
int n,k,m;
struct matrix{
int x[35][35];
};
matrix mul(matrix a,matrix b){
matrix c;
mem(c.x,0);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
c.x[i][j]+=(a.x[i][k]*b.x[k][j]);
c.x[i][j]%=m;
}
}
}
return c;
}
matrix add(matrix a,matrix b){
matrix c;mem(c.x,0);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
c.x[i][j]=a.x[i][j]+b.x[i][j];
c.x[i][j]%=m;
}
}
return c;
}
matrix kum(matrix a,int i){
matrix res;mem(res.x,0);
for(int i=1;i<=n;i++) res.x[i][i]=1;
while(i){
if(i&1){
res=mul(res,a);}
i>>=1;
a=mul(a,a);
}
return res;
}
matrix sum(matrix a,int k){
if(k==1)return a;
matrix t=sum(a,k/2);
if(k&1){
matrix x=kum(a,k/2+1);
t=add(t,mul(x,t));
t=add(t,x);
}
else{
matrix x=kum(a,k/2);
t=add(t,mul(t,x));
}
return t;
}
int main(){
scanf("%d%d%d",&n,&k,&m);
matrix a;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&a.x[i][j]);
}
}
matrix ans=sum(a,k);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
printf("%d ",ans.x[i][j]);
}
printf("\n");
}
}