~斐波那契数列迷之计算~

令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.

【问题描述】 【问题描述】编写函数f,功能是用递归的方法求斐波那契数列的第n函数原型为 int f(int n),在主函数中输入一个正整数n,调用函数f求出斐波那契数列的第n,并在主函数中输出。 斐波那契数列:1,1,2,3,5,8,13,21…… 【输入形式】3 【输出形式】2 【样例输入】6 【样例输出】8 【问题描述】编写函数f,功能是用递归的方法求斐波那契数列的第n函数原型为 int f(int n),在主函数中输入一个正整数n,调用函数f求出斐波那契数列的第n,并在主函数中输出。 斐波那契数列:1,1,2,3,5,8,13,21…… 【输入形式】3 【输出形式】2 【样例输入】6 【样例输出】8 【问题描述】编写函数f,功能是用递归的方法求斐波那契数列的第n函数原型为 int f(int n),在主函数中输入一个正整数n,调用函数f求出斐波那契数列的第n,并在主函数中输出。 斐波那契数列:1,1,2,3,5,8,13,21…… 【输入形式】3 【输出形式】2 【样例输入】6 【样例输出】8 【问题描述】编写函数f,功能是用递归的方法求斐波那契数列的第n函数原型为 int f(int n),在主函数中输入一个正整数n,调用函数f求出斐波那契数列的第n,并在主函数中输出。 斐波那契数列:1,1,2,3,5,8,13,21…… 【输入形式】3 【输出形式】2 【样例输入】6 【样例输出】8 斐波那契数列:1,1,2,3,5,8,13,21…… 【输入形式】3 【输出形式】2 【样例输入】6 【样例输出】8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值