您的位置:首页 > 产品设计 > UI/UE

Fibonacci sequence 纪中 1240 矩阵乘法

2016-07-12 17:07 555 查看


分析

这就是裸的矩阵乘法啊!!!

数列f
=f[n-1]+f[n-2],f[1]=f[2]=1的前n项和s
的快速求法

0 1 0

1 1 1

0 0 1

代码

const
a1:array[1..3,1..3] of int64=((0,1,0),
(1,1,1),
(0,0,1));
f:array[1..3] of int64=(1,1,1);

type
arr=array[1..3,1..3] of int64;

var
a:arr;
b:array[1..10] of int64;
i,j,k:longint;
n,n1:int64;
m:longint;
ans:longint;

function cheng(x,x1:arr):arr;
var
i,j,k:longint;
begin
fillchar(cheng,sizeof(cheng),0);
for i:=1 to 3 do
for j:=1 to 3 do
for k:=1 to 3 do
cheng[i,j]:=(cheng[i,j]+x[i,k]*x1[k,j]) mod 10000;
end;

function seach(n:int64):arr;
var
i,j,k:longint;
an:arr;
begin
fillchar(an,sizeof(an),0);
if n<>1
then
if n mod 2=0
then begin
an:=seach(n div 2);
seach:=cheng(an,an);
end
else begin
an:=seach(n div 2);
an:=cheng(an,an);
seach:=cheng(an,a1);
end
else
seach:=a1;
end;

begin
readln(m);
for i:=1 to m do begin
read(n,n1);
n:=n-2; n1:=n1-1;
ans:=0;
fillchar(b,sizeof(b),0);
if n>0 then begin
a:=seach(n);
for j:=1 to 3 do
for k:=1 to 3 do
b[j]:=(b[j]+f[k]*a[k,j]) mod 10000;
ans:=b[3] mod 10000;
end
else if n<>-1 then ans:=1;
n:=n1;
fillchar(b,sizeof(b),0);
if n>0 then begin
a:=seach(n);
for j:=1 to 3 do
for k:=1 to 3 do
b[j]:=(b[j]+f[k]*a[k,j]) mod 10000;
ans:=b[3] mod 10000-ans;
end
else if n<>-1 then ans:=1-ans;
if ans<0 then ans:=ans+10000;
writeln(ans);
end;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: