现在的位置: 首页 > 综合 > 正文

一道有道编程题

2018年03月16日 ⁄ 综合 ⁄ 共 1815字 ⁄ 字号 评论关闭
 
描述

菲波那切数列可以用下列的式子表示:
f(1)=1
f(2)=1
f(n)=f(n-1)+f(n-2) (n>=3)

现在我们根据这个规则定义另一种数列 命名为"辛波那切数列", 它是这样定义的:
s(x)=0 (x<0)
s(x)=1 (0<=x<1)
s(x)=s(x-1)+s(x-3.14) (x>=1)

现在需要计算出s(x) MOD 1000000007的值。

输入

第一行有一个正整数T表示有T组测试数据。
接下来T行,每行包含一个数x。
其中 T<=10000, -1000.0<=x<=1000.0

输出

有T行,依次输出每组数据的结果。

 
样例输入
3
-1
0.667
3.15
样例输出
0
1
2
 要求
时间限制 1000ms 内存限制 65536kb

我的分析

      采用简单的递归的方法在做这题时间上肯定会超时,因而只有分析下,有没有其它的办法。

      经过分析,看能否转换为fibonacci数的问题:

      当x<-[1,3.14)时,s(x)=s(x-1)=...=1,s(x-3.14)=0;--------s(x)=1;

      当x<-[3.14,4.14)时,x-1<-[2.14,3.14),s(x-1) = 1,s(x-3.14)=1-------s(x)=2;

      当x<-[4.14,5.14)时,x-1<-[3.14,4.14) ,s(x-1) =2 ,x-3.14<-[1,2),s(x-3.14)=1;------s(x)=3;

      当x<-[5.14,6.14)时,x-1<-[4.14,5.14),s(x-1)=3,x-3.14<-[2,3),s(x-3.14)=1;---------s(x)=4;

      当x<-[6.14,7.14)时,x-1<-[5.14,6.14),s(x-1)=4,x-3.14<-[3,4),...此时s(x-3.14)的值不定,分析就此截止

     说明x-1与x-3.14不是正好落在分别前两个区间,故其函数值也不能用前两个区间的函数值之和来计算;美好的想法只能落空。

网友的分析

以下引用http://topic.csdn.net/u/20100524/22/c3ff1e6d-8d2d-42f4-a982-cddf7ab77528.html网友的分析和代码

12楼:danjiewu

条件-1000.0<=x<=1000.0很关键,其实要把3.14当作整数来看待,也就是s(x)=s(x-100)+s(x-314),-100000<=x<=100000,这样就好办了,直接把所有结果都计算出来就可以了。当然还要考虑到精度损失的问题,这个倒卡了好久。

danjiewu的代码:

 

6楼knate

 

 

 

 

 

抱歉!评论已关闭.