1471: 又是斐波那契数列??
时间限制: 1 Sec 内存限制: 128 MB
提交: 345 解决: 46 统计
题目描述
大家都知道斐波那契数列吧?斐波那契数列的定义是这样的: f0 = 0; f1 = 1; fi = fi-1 + fi-2
现在给你一个数x,聪明的你一定知道这是斐波那契数列中的第几项。
(数据保证x一定有对应的项y,且 2 <= y < 1e4)
输入
第一行一个整数T,表示测试组数。
之后的T行,每行一个数x
输出
对于每个测试数据,输出一行表示数x是第几项
样例输入
2
2
5
样例输出
3
5
思路:
当时第一眼看到这个题没注意,以为要被询问的数据不会超过1e4,直接打表,结果就很明显了,上来就wa两发,一下冷静了,再看题目,妈耶,项数不会超过1e4,longlong?想都不要想,直接放弃;
现在再看思路,其实还是打表,不过是有理论支持的,首先我们需要了解一下longlong的存储问题(大概是个学过C语言的人都懂)当我们要存的数N大于longlong的范围时,我们称溢出,但是longlong仍然会把N存到里面,溢出的自然不会管,那么我们得到的就应该是N对longlong的取模
现在再看这个题就简单多了,我们只需要开一个longlong数组打个1e4的表,然后对于询问的数以相同的longlong取模规律求出再暴力查找即可(有点类似hash的思想)
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<map>
#include<set>
#include<vector>
#include<stack>
#include<queue>
#define ll long long
using namespace std;
char num[20005];
ll f[10005];
void init()
{
f[0] = 0,f[1] = 1;
for (int i = 2;i < 10005;i ++)
f[i] = f[i - 1] + f[i - 2];
}
ll solve(int n)
{
ll ans = 0;
for (int i = 0;i < n;i ++)
ans = ans * 10 + num[i] - '0';
return ans;
}
int main()
{
init();
int t;
scanf("%d",&t);
while (t --)
{
scanf("%s",num);
int len = strlen(num),ans;
ll x = solve(len);
for (int i = 2;i <= 10000;i ++)
{
if (f[i] == x)
{
ans = i;
break;
}
}
printf("%d\n",ans);
}
return 0;
}