hpuoj1471 又是斐波那契数列?? A题

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;
 } 

猜你喜欢

转载自blog.csdn.net/cloudy_happy/article/details/81280966