题目概述
给定n*n的矩阵A,求A^k
n<=100, k<=10^12, |矩阵元素|<=1000
输出时对每个元素对10^9+7取模
解题思路
设一n*n的矩阵为A,其元素为A[i,j](1<=i,j<=n)
则A*A可用以下代码实现:
for i:=1 to n do
for j:=1 to n do
for k:=1 to n do
C[i,j]:=C[i,j]+A[i,k]*A[k,j];
由于k值较大,又存在重复运算,可以使用快速幂化简。
时间复杂度:O(n^3 log k)
空间复杂度:O(n^3)
源程序
const
maxn:int64=1000000007;
var
a,b,c:array[1..100,1..100]of int64;
i,n,j:longint;
k:int64;
procedure ksm(p:int64);
var
i,j,k:longint;
begin
if (p=0)or(p=1) then begin
b:=a;
exit;
end;
ksm(p div 2);
if odd(p) then begin
fillchar(c,sizeof(c),0);
for i:=1 to n do
for j:=1 to n do
for k:=1 to n do
c[i,j]:=(c[i,j]+b[i,k]*b[k,j])mod maxn;
b:=c;
fillchar(c,sizeof(c),0);
for i:=1 to n do
for j:=1 to n do
for k:=1 to n do
c[i,j]:=(c[i,j]+b[i,k]*a[k,j])mod maxn;
b:=c;
end
else begin
fillchar(c,sizeof(c),0);
for i:=1 to n do
for j:=1 to n do
for k:=1 to n do
c[i,j]:=(c[i,j]+b[i,k]*b[k,j])mod maxn;
b:=c;
end;
end;
begin
readln(n,k);
for i:=1 to n do
begin
for j:=1 to n do
read(a[i,j]);
readln;
end;
b:=a;
ksm(k);
for i:=1 to n do
begin
for j:=1 to n do
write(b[i,j],' ');
writeln;
end;
end.