• 【问题描述】
    令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.
    
    
  • 相关阅读:
    Java 获取本机IP
    IDEA2017.3.1破解激活
    java访问https绕过证书信任
    windows版nginx+ftp实现图片服务器的搭建
    json转字符串,json转list,json转pojo的工具类
    文件上传到ftp服务工具类
    一个servlet处理多个功能
    一二级栏目的查询
    后台接收URL地址的参数
    SSH邮箱验证与激活
  • 原文地址:https://www.cnblogs.com/zyx-crying/p/9319552.html
Copyright © 2020-2023  润新知