zoukankan      html  css  js  c++  java
  • 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
    ",mp[ans]);
    	}
    	return 0;
    }
  • 相关阅读:
    wcf 配置
    一般处理程序问题重命名后问题
    jQuery取得select选择的文本与值
    C# 读取excel
    ajax 跨域问题
    java转义字符
    oracle日期时间的加减法
    在MyEclipse中,jsp文件输入中文,文件不能保存
    转自JavaEye Oracle函数大全
    转Oracle数据类型及存储方式【F】
  • 原文地址:https://www.cnblogs.com/Friends-A/p/10324433.html
Copyright © 2011-2022 走看看