【问题描述】
令F(N)为斐波那契数列第N项,其中 F(0)=0,F(1)=1,F(N)=F(N−1)+F(N−2)。
所以要干啥呢?
求F(F(N))。
【输入格式】
第一行 一个整数T代表数据组。
接下来 T行每一个整数 N。
【输出格式】
T行每行一个整数代表答案对 109+7取模的值。
【样例输入】
4
0
1
2
6
【样例输出】
0
1
1
21
【样例解释】
无。
【数据规模与约定】
对于 20%的数据, 1≤N≤15。
对于 40%的数据, 1≤N≤90。
对于 70%的数据, 1≤N≤105。
对于 100%的数据, 1≤T≤103,1≤N≤10100。
【题解】
另一个题解告诉我的,LZH告诉我的,……告诉我的。我就对了。
【代码】
const
fe=329616;
type
arr=array[1..2,1..2] of int64;
var
s:ansistring;
n,time,mo,l:longint;
a,c:arr;
procedure mi(a,b:arr);
var
i,j,k:longint;
begin
fillchar(c,sizeof(c),0);
for i:=1 to 2 do
for j:=1 to 2 do
for k:=1 to 2 do
c[i,k]:=(c[i,k]+a[i,j]*b[j,k]) mod mo;
end;
procedure main(n:longint);
begin
if n<=1 then exit;
main(n div 2);
mi(c,c);
if odd(n) then mi(c,a);
end;
procedure try1;
var
i,t:longint;
begin
n:=0; t:=1;
for i:=l downto 1 do
begin
n:=(n+t*(ord(s[i])-48)) mod fe;
t:=t*10 mod fe;
end;
end;
begin
readln(time);
while time>0 do
begin
readln(s);
if s='0' then begin writeln(s); continue; end;
l:=length(s);
try1;
a[1,1]:=0; a[1,2]:=1;
a[2,1]:=1; a[2,2]:=1;
c:=a; mo:=2000000016;
main(n);
n:=c[2,2]-1;
a[1,1]:=0; a[1,2]:=1;
a[2,1]:=1; a[2,2]:=1;
c:=a; mo:=1000000007;
main(n);
writeln((c[2,2]) mod mo);
dec(time);
end;
end.