【问题描述】
令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.

posted @ 2016-10-26 17:41  猪都哭了  阅读(125)  评论(0编辑  收藏  举报