洛谷 P3390 矩阵快速幂

题目概述

    给定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.

你可能感兴趣的:(矩阵乘法)