悟空学艺monkey(NDK1635)

大闹天宫的孙悟空穿越时空来到21世纪的泰山,面临智力挑战,试图通过解答问题进入修炼之地。这是一场融合传统与现代智慧的较量。
悟空学艺monkey

Time Limit:10000MS  Memory Limit:65536K
Total Submit:30 Accepted:4

Description
话说当初大闹天宫的猴头反斗精——孙悟空来到了21世纪。当他通过时空隧道来到21世纪时才发现世界发生了翻天覆地的变化。于是他决定来中国的泰山学艺。他在海南腾云驾雾来到泰山脚下,谁知脚下却有两个人把守。他走上前对他们说:“喂!我要见你们的师傅——粉面大秃驴。”那两个人没有搭理他,反而说:“我们的师傅岂是你这个毛猴想见就见的!”孙悟空听了,心中很是愤怒,心想:当初我大闹天宫时,怕过谁!而现在却让这两个毛孩训斥,哼!给你们点厉害瞧瞧。接着,他就掏出金箍棒朝那两个人砸去。可是谁知刚砸到他们面前,却被一道光给挡了回来。原来他们的面前都有一道防护层。“哼!21世纪还用武力解决问题,白痴!”他们不懈的说,“21世纪是智慧的时代,不过,看你是孙悟空的面子上,你只要答对我们的问题,我便放你进去见我们的师傅。”悟空听了,无奈的点了点头,看来只有这样了。“好,猴头,你听好了!这里有一个桃子,我们以下列的方式对它进行变换:

① 开始时,只有一个桃子;
② 每一次变换,把其中的桃子变成桃子和梨,其中的梨变成桃子。

我们用‘T’表示桃子,用‘L’表示梨,则经过无数次的变换,我们得到如下字符串“TLTTLTLTTLTTLTLTTLT……”。现在你的任务是:每次给你n个询问,每个询问为:在区间a和b之间有多少个桃子。”孙悟空听了傻了眼,他一个从石头里蹦出来的猴子,哪会这么多东西。可是他必须要去见泰山宗,怎么办呢?看来只有求助于你们了。

Input
第一行是一个整数n,表示有n次提问,后面有n行,每行有两个整数a和b,用空格隔开。

Output
共n行,每行有一个回答,表示在这个区间内有多少个桃子。

Sample Input
1
2 8

Sample Output
4

Hint
【数据规模】
对于100%的数据
1 < = n <= 5000
1 <= a <= b < 2^63

Source

 

算法:DP+递归

挺简单的一道题了,一开始没太看懂题,其实就是个考察斐波那契数列应用的题目。
根据题目要求,建立两个斐波那契数列,一个表示当前项长度,一个表示当前项所含有的桃子数,不难发现,长度的项比桃子的项向后移了一位。
因此我们进行查找,查找的时候就根据长度查找就行了。

 

program monkey;

const
 maxn=5000;
 maxm=91;

var
 n:longint;
 f,len:array [0..maxm] of int64;
 
procedure init;
var
 i:longint;
begin
 f[0]:=1;
 f[1]:=1;
 len[0]:=1;
 len[1]:=2;
 for i:=2 to maxm do
  begin
   f[i]:=f[i-1]+f[i-2];
   len[i]:=len[i-1]+len[i-2];
  end;
 readln(n);
end;

function find(x:int64;l:longint):int64;
begin
 if x=0 then exit(0);
 find:=0;
 if x=len[l] then find:=f[l]
 else if x<=len[l-1] then find:=find(x,l-1)
 else find:=f[l-1]+find(x-len[l-1],l-2);
end;

procedure main;
var
 i,x,y:longint;
begin
 for i:=1 to n do
  begin
   readln(x,y);
   writeln(find(y,maxm)-find(x-1,maxm));
  end;
end;

begin
 assign(input,'monkey.in'); reset(input);
 assign(output,'monkey.out'); rewrite(output);
 
 init;
 main;
 
 close(input); close(output);
end.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值