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

Fibonacci sequence_纪中1240_矩阵乘法

2016-07-12 16:59 495 查看


好懒好懒,直接放图

题解:

看到很水啊就直接做了

先是直接上递推,结果好像不行

矩阵乘法硬上结果忘了考虑前一个数mod10000小于后一个数的情况,wa*n

代码

type
arr=array[1..3,1..3] of longint;
const
matrix:array[1..3,1..3] of longint=((0,1,0),(1,1,1),(0,0,1));
f:array[1..3]of longint=(1,1,1);
p=10000;
var
a:arr;
b:array[1..3] of longint;
j,k,n,m,t,ans:longint;
function cal(x,x1:arr):arr;
var
i,j,k:longint;
begin
fillchar(cal,sizeof(cal),0);
for i:=1 to 3 do
for j:=1 to 3 do
for k:=1 to 3 do
cal[i,j]:=(cal[i,j]+x[i,k]mod p*x1[k,j]mod p)mod p;
end;
function pow(r:longint):arr;
var
v:arr;
begin
fillchar(v,sizeof(v),0);
if r=1 then exit(matrix);
if r and 1=0 then
begin
v:=pow(r div 2);
pow:=cal(v,v);
end
else
begin
v:=pow(r div 2);
v:=cal(v,v);
pow:=cal(v,matrix);
end
end;
begin
readln(t);
while t>0 do
begin
readln(n,m);
dec(n,2);
dec(t);
dec(m);
ans:=0;
fillchar(b,sizeof(b),0);
if n=0 then
ans:=1
else
if n>0 then
begin
a:=pow(n);
for j:=1 to 3 do
for k:=1 to 3 do
b[j]:=(b[j]+f[k]mod p*a[k,j]mod p) mod p;
ans:=b[3]mod p;
end;
fillchar(b,sizeof(b),0);
a:=pow(m);
for j:=1 to 3 do
for k:=1 to 3 do
b[j]:=(b[j]+f[k]mod p*a[k,j]mod p)mod p;
ans:=(b[3]mod p-ans)mod p;
while ans<0 do
ans:=ans+p;
writeln(ans);
end;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: