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

题意

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

思路

一开始想着打表,然后直接查找,但是发现数太大了。然后换了个思路,也是打表,然后每个数对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;
}

 

posted @ 2018-07-29 19:24  友人-A  阅读(609)  评论(0编辑  收藏  举报