题目:
Given a n × n matrix A and a positive integer k, find the sum S = A + A^2 + A^3 + … + A^k.
题解:
构造矩阵
A A
0 E
与单位矩阵进行k次矩阵乘法
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <iostream>
#include <algorithm>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <vector>
using namespace std;
int mod;
struct Matrix
{
int n,m,d[70][70];
Matrix (int a,int b)
{
n = a, m = b;
memset(d,0,sizeof(d));
}
friend Matrix operator * (const Matrix &a,const Matrix &b)
{
Matrix c(a.n,b.m);
for (int i=0;i<a.n;i++)
for (int j=0;j<b.m;j++)
{
int tmp = 0;
for (int k=0;k<a.m;k++)
{
tmp += a.d[i][k] * b.d[k][j] % mod;
tmp %= mod;
}
c.d[i][j] = tmp % mod;
}
return c;
}
};
int main()
{
int n,k,a[100][100];
scanf("%d %d %d",&n,&k,&mod);
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
scanf("%d",&a[i][j]);
//构造矩阵
Matrix A(2*n,2*n),B(2*n,2*n);
for (int i=0;i<n;i++)
for (int j=0;j<2*n;j++)
A.d[i][j] = a[i][j % n];
for (int i=n;i<2*n;i++) A.d[i][i] = 1;
for (int i=0;i<2*n;i++) B.d[i][i] = 1;
//矩阵快速幂
while (k)
{
if (k & 1) B=B*A;
A=A*A;
k >>= 1;
}
for (int i=0;i<n;i++)
{
for (int j=n;j<2*n;j++) printf("%d ",B.d[i][j]);
printf("\n");
}
return 0;
}