洛谷 3390 矩阵快速幂

题目背景

矩阵快速幂

题目描述

给定n*n的矩阵A,求A^k

输入输出格式

输入格式:
第一行,n,k

第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素

输出格式:
输出A^k

共n行,每行n个数,第i行第j个数表示矩阵第i行第j列的元素,每个元素模10^9+7

输入输出样例

输入样例#1:
2 1
1 1
1 1
输出样例#1:
1 1
1 1
说明

n<=100, k<=10^12, |矩阵元素|<=1000

算法:矩阵快速幂

type point=array[1..100,1..100] of int64;
var
y,k:int64;
n,i,j:longint;
a,ans,c:point;
procedure cheng(var a,b:point);
var i,j,k:longint;
begin
for i:=1 to n do
for j:=1 to n do
begin
c[i,j]:=a[i,1]*b[1,j] mod 1000000007;
for k:=2 to n do
c[i,j]:=(c[i,j]+a[i,k]*b[k,j]) mod 1000000007;
end;
for i:=1 to n do
for j:=1 to n do
a[i,j]:=c[i,j];
end;
begin
readln(n,k);
for i:=1 to n do
for j:=1 to n do
read(a[i,j]);
ans:=a;
dec(k);
while k>0 do
begin
if k and 1=1 then cheng(ans,a);
cheng(a,a);
k:=k>>1;
end;
for i:=1 to n do
begin
for j:=1 to n do
write(ans[i,j],’ ‘);
writeln;
end;
end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值