描述
Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak.
输入
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 the elements of S modulo m in the same way as A is given.
样例输入
2 2 4
0 1
1 1
样例输出
1 2
2 3
题目大意A是个矩阵 S = A + A^2 + A^3 + … + A^k;求出S;
首先 A^k通过快速幂求,(矩阵乘法:矩阵相乘详解_矩阵乘法_wmy0217_的博客-CSDN博客)
然后
以此递推
有一点要注意 当k是奇数时要把A^k单独拿出来然后去求(A + A^2 … + A^((k-1)/2)A^(k-1)
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pll;
int a[33][33],m,ss[33][33],f0[33][33];
int n,k;
void fz(int x[][33],int y[][33])
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) x[i][j]=y[i][j];
}
void ce(int x[][33],int y[][33])
{
int xx[33][33];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
int sum=0;
for(int k=1;k<=n;k++)
{
sum=(sum+x[i][k]*y[k][j])%m;
}
xx[i][j]=sum;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) x[i][j]=xx[i][j];
}
void jia(int x[][33],int y[][33])
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) x[i][j]=(x[i][j]+y[i][j])%m;
}
void sum(int k1)
{
int b1[33][33],fb=0;int b[33][33];
if(k1==0)
{
fz(ss,a);
return ;
}
sum(k1/2);
if(k1%2==1&&k1!=1)
{
int c[33][33],k2=k1;fb=1;fz(c,a);fz(b1,f0);
while(k2)
{
if(k2&1) ce(b1,c);
k2>>=1;
ce(c,c);
}
}
int bb[33][33];
fz(bb,a);
fz(b,f0);
while(k1)
{
if(k1&1) ce(b,bb);
k1>>=1;
ce(bb,bb);
}
if(fb) jia(ss,b1);
fz(bb,ss);
ce(ss,b);
jia(ss,bb);
}
void lsl()
{
cin>>n>>k>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
if(i==j) f0[i][j]=1;
}
}sum(k/2);int b1[33][33];
if(k%2==1&&k!=1)
{
int c[33][33],k2=k--;fz(c,a);fz(b1,f0);
while(k2)
{
if(k2&1) ce(b1,c);
k2>>=1;
ce(c,c);
}jia(ss,b1);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(j==n)
{
if(i==n) cout<<ss[i][j];
else cout<<ss[i][j]<<endl;
}
else cout<<ss[i][j]<<" ";
}
}
int main()
{
int t=1;
while(t--)
{
lsl();
}
}