题目大意是给定你数列前两项f0=0,f1=1,先给你一个数x,问是第几项?其中可能出现1e+4项
题意分析:题目中说可能出现1e+4项,那么可想而知是无法用数组来正常储存每一项的数字的,因为数列的递增速度很快,在第40项时就已超出long long 的范围,所以这时就需要储存一个数的溢出值,尽管溢出值并不等价于原来的数字,但是对于同一个数字来说,溢出的值相同,而对于不相同的项,溢出值相同的概率十分小,可以忽略不计,所以就得到了这道题的整体思路
代码`
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e+4;
int f[maxn+100]={0,1};
map<long long ,int> mp;
int main()
{
mp[0]=0;
mp[1]=1;
for(int i=2;i<maxn+100;i++)
{
f[i]=f[i-1]+f[i-2];
mp[f[i]]=i;
}
int t;
cin>>t;
while(t--)
{
string s;
cin>>s;
unsigned long long ans=0;
for(int i=0;i<s.size();i++)
{
ans+=(ans*10+s[i]-'0');
}
cout<<mp[ans]<<endl;
}
return 0;
}