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;
    }
  • 相关阅读:
    Xamarin.Forms Layout Challenges – Social Network App(转载)
    Erlang gen_server:start_link/3 和gen_server:start_link/4
    Erlang 从URL中截取尾部文件名
    Erlang 聊天室程序(三) 数据交换格式json的decode
    SOCKS5协议
    Erlang 聊天室程序( 一)
    Erlang 聊天室程序(八) 主题房间supervisor 的使用
    Erlang 聊天室程序(四) 数据交换格式json的encode
    Erlide 的安装使用
    日志系统引起的争论
  • 原文地址:https://www.cnblogs.com/Friends-A/p/10324433.html
Copyright © 2011-2022 走看看