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

被折叠的 条评论
为什么被折叠?



