现在的位置: 首页 > 综合 > 正文

vijos1067Warcraft III 守望者的烦恼——by rfy

2018年05月02日 ⁄ 综合 ⁄ 共 830字 ⁄ 字号 评论关闭

矩阵乘法练手。。。

第一次写,各种错误,累死了。。。

type
matrix=record
jz:array[1..20,1..20] of int64;
end;
var
k,n,mi,a:int64;
i,j:longint;
f:array[1..100] of int64;
ans:matrix;
sum:array[0..100] of matrix;

function chen(x,y:matrix):matrix;
var i,j,l:longint;
begin
for i:=1 to k do
  for j:=1 to k do
  begin
    chen.jz[i,j]:=0;
    for l:=1 to k do
      chen.jz[i,j]:=(chen.jz[i,j]+x.jz[i,l]*y.jz[l,j]) mod 7777777;
  end;
end;

function need(i:int64):int64;
begin
need:=0;
while i mod 2=0 do
begin
  inc(need);
  i:=i div 2;
end;
end;

begin
readln(k,n);
for i:=1 to k-1 do
  sum[0].jz[i,i+1]:=1;
for i:=1 to k do
  sum[0].jz[k,i]:=1;

for i:=1 to 32 do
  sum[i]:=chen(sum[i-1],sum[i-1]);

mi:=n-k;
for i:=1 to k do
  ans.jz[i,i]:=1;
while mi>0 do
begin
  ans:=chen(ans,sum[need(mi)]);
  mi:=mi-1 shl need(mi);
end;
//get ans ju zhen

for i:=1 to k do
  f[i]:=1;
for i:=2 to k do
  for j:=1 to i-1 do
    f[i]:=f[i]+f[j];
if k=n then
begin
  write(f[n]);
  exit;
end;

for i:=1 to k do
  a:=(a+ans.jz[k,i]*f[i]) mod 7777777;
write(a);
end.

抱歉!评论已关闭.