HPU 1471:又是斐波那契数列??(大数取模)

时间:2023-03-09 19:10:02
HPU 1471:又是斐波那契数列??(大数取模)

1471: 又是斐波那契数列??

时间限制: 1 Sec 内存限制: 128 MB

提交: 278 解决: 27 统计

题目描述

大家都知道斐波那契数列吧?斐波那契数列的定义是这样的: f0 = 0; f1 = 1; fi = fi-1 + fi-2

现在给你一个数x,聪明的你一定知道这是斐波那契数列中的第几项。

(数据保证x一定有对应的项y,且 0 <= y < 1e4)

输入

第一行一个整数T,表示测试组数。

之后的T行,每行一个数x

输出

对于每个测试数据,输出一行表示数x是第几项

样例输入

2
2
5

样例输出

3
5

HPU 1471:又是斐波那契数列??(大数取模)

题意

给出一个数,求是斐波那契里的第几项

思路

一开始想着打表,然后直接查找,但是发现数太大了。然后换了个思路,也是打表,然后每个数对1e9+7取模(取模的数字随便找,不会爆范围就行),然后输入数n,遍历打好的斐波那契表,如果n对表中的某一项取模为0,那么该项就是n在斐波那契中的位置。

注意:输入的数n很大,要用字符串输入,然后利用大数取模来操作。(一开始忘了n的范围,一直拿着打好的表中的数来算,导致了WA9。QAQ,罚时爆炸)。

AC代码

#include<bits/stdc++.h>
#define ll unsigned long long
#define ms(a) memset(a,0,sizeof(a))
#define pi acos(-1.0)
const int mod=1e9+7;
const int maxn=1e4+10;
using namespace std;
char num[maxn];
ll a[maxn];
int l;
int main()
{
int t;
a[0]=0;
a[1]=1;
map<ll,int>mp;
//打好表,用map记录每个数的位置
for(int i=2;i<maxn;i++)
{
a[i]=(a[i-1]%mod+a[i-2]%mod)%mod;
mp[a[i]]=i;
}
scanf("%d",&t);
while(t--)
{
ll n;
ms(num);
scanf("%s",num);
int l=strlen(num);
ll ans=0;
//对输入的超大的斐波那契数取模
for(int i=0;i<l;i++)
{
ans=(ans*10+num[i]-'0')%mod;
}
//输出取模后的数的位置
printf("%d\n",mp[ans]);
}
return 0;
}