令f(n)为斐波那契数列第n项,其中 f(0)=0,f(1)=1,f(n)=f(n−1)+f(n−2)。
所以要干啥呢?
求f(f(n))。
输入:
4
0
1
2
6
输出:
0
1
1
21
数据规模:
对于 20%的数据, 1≤n≤15。
对于 40%的数据, 1≤n≤90。
对于 70%的数据, 1≤n≤10^5。
对于 100%的数据, 1≤t≤10^3,1≤n≤10^100
分析:
先把n mod 329616;
再用矩阵乘法算出k(k=f(n));把k mod (2.0*10^9+16)(可以一边矩阵乘法一边mod);
再把求一次f(k)就是解。
代码:
type
arr=array [1..2,1..2] of int64;
const
fe=329616;
var
c,d:arr;
i,j,t,b,he,x:longint;
s:ansistring;
procedure sq(a1,b1:arr);
var i,j,k:longint;
a,b:arr;
begin
a:=a1; b:=b1;
for i:=1 to 2 do
for j:=1 to 2 do
begin
c[i,j]:=0;
for k:=1 to 2 do
c[i,j]:=(c[i,j]+(a[i,k]*b[k,j]) mod he) mod he;
end;
end;
procedure main(n:longint);
begin
if n>1 then main(n div 2)
else exit;
sq(c,c);
if odd(n) then sq(c,d);
end;
begin
readln(t);
for i:=1 to t do
begin
readln(s);
b:=0; x:=1;
for j:=length(s) downto 1 do
begin
b:=(b+x*(ord(s[j])-48)) mod fe;
x:=x*10 mod fe;
end;
c[1,1]:=0; c[1,2]:=1;
c[2,1]:=1; c[2,2]:=1;
d:=c; he:=2000000016;
main(b-1);
b:=c[2,2];
c[1,1]:=0; c[1,2]:=1;
c[2,1]:=1; c[2,2]:=1;
he:=1000000007;
main(b-1);
writeln(c[2,2]);
end;
end.