试题 算法提高 研究兔子的土豪
资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
某天,HWD老师开始研究兔子,因为他是个土豪
,所以他居然一下子买了一个可以容纳10^18代兔子的巨大笼子(好像比我们伟大的地球母亲大一点点?),并开始研究它们,之后,他了解了兔子的繁衍规律:即fibonacci数列。
兔子繁殖了n代后,HWD老师很开心。
但是,HWD老师有密集恐惧症,所以,他只能去卖了兔子,他找到了一个好的雇主,但是这个雇主有强迫症,他只每次收购1007只兔子,HWD老师为了避免自己的密集恐惧症,要尽量多的卖了兔子。
但是即便是密集恐惧症,也打击不了HWD老师研究兔子的决心,他数着数着自己剩下的兔子……
输入格式
HWD老师让兔子繁衍了几代(一个整数,没有其他字符)。
输出格式
HWD老师剩余(残余?)的兔子(一个整数,忽略行尾回车及空格)。
样例输入
1
样例输出
1
数据规模和约定
兔子的总量最大时小于HWD老师笼子的大小。
f[1]=1,f[2]=1,f[3]=2 ……
本题解析已放在代码中,请看下方具体代码:
#include <iostream>
using namespace std;
int main()
{
long long int n,f[10000]={0,1,1},rand=0;//这里数组f用于存储每一月的兔子数量,第一天第二天兔子数量均为1
cin>>n;
for(int i=3;i<=n;i++)
{
f[i]=f[i-1]+f[i-2];//兔子的繁衍规律:即fibonacci数列,那么我们只管使用这个规律即可,不需要考虑兔子卖后的其他因素
f[i]=f[i]%1007;//这里取1007的余,相当于当兔子数量超过1007,就卖出1007只
if(f[i-1]==1 && f[i]==1)//这里涉及斐波那契循环节,大家可以理解为在一个斐波那契数列中如果对每一个数据都取一个固定值的余,那么斐波那契数列中存在循环周期
{//由于第一个月和第二个月都为1,那么斐波那契数循环节的循环开头始终为第一个数和第二个数均为1,这时我们找出这段循环范围即可
rand=i-2;
break;
}
}
if(rand!=0)//如果找出循环节,那么就对n取余,获取其相当于在第一个循环节的数
{
n=n%rand;
}
cout<<f[n];//最终输出f[n]
return 0;
}
该题涉及斐波那契循环节,请大家自行查阅(我只能说数学总是与算法密不可分,真是太难了!)
欢迎大家留言评论,谢谢大家!