zoukankan      html  css  js  c++  java
  • 7-大数斐波那契额数列

    链接:https://www.nowcoder.net/acm/contest/71/C
    来源:牛客网

    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 262144K,其他语言524288K
    64bit IO Format: %lld

    题目描述

    小W在计算一个数列{An},其中A1=1,A2=2,An+2=An+1+An。尽管他计算非常精准,但很快他就弄混了自己的草稿纸,他找出了一些他计算的结果,但他忘记了这些都是数列中的第几项。

    输入描述:

    每行包括数列中的一项Ak(k<=100000)。

    总行数T<=30。

    输出描述:

    对于每一项Ak,输出一行包括一个正整数k表示输入中数是数列的第几项。

    示例1

    输入

    2
    3
    5
    8
    13

    输出

    2
    3
    4
    5
    6
    并没有ac的答案:先用大数加法,求出每个数,在对输入的数用二分查找--->超时
    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    string a[100005];
    
    string sum(string s1,string s2){  //大数加法(string + string, return string)
        if(s1.length()<s2.length())
        {
            string temp=s1;
            s1=s2;
            s2=temp;
        }
        int i,j;
        for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--)
        {
            s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));   //注意细节
            if(s1[i]-'0'>=10)
            {
                s1[i]=char((s1[i]-'0')%10+'0');
                if(i) s1[i-1]++;
                else s1='1'+s1;
            }
        }
        return s1;
    }
    void db(){
    	a[1] = "1";
    	a[2] = "2";	
    	for(int i = 3; i <= 10000; i++){
    		a[i] = sum(a[i - 1], a[i - 2]);
    	}
    	cout << a[200] << endl;
    }
    int bSearch(int begin, int end, string e)      //二分查找string数组中的目标串
    {    
        int mid, left = begin, right = end;   
        while(left <= right)    
        {    
            mid = (left + right) >> 1;    
            if(a[mid] == e) 
           return mid; else if(a[mid].length() > e.length()) //根据string重载<>的的特点,我没要先按长度排序   right = mid - 1; else if(a[mid].length() < e.length())   left = mid + 1;      else if(a[mid] > e)   right = mid - 1;      else if(a[mid] < e) left = mid + 1; } return left; } int main(){ db(); string str; while(cin >> str){ int x = bSearch(0, 30000, str); printf("%d ", x); } return 0; }

      附上ac代码:居然可以取模来离散一下,还是题目做少了,赶紧刷题去:

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll mod = 1e9+7;
    ll a[100005] = {0, 1, 2};
    
    int main(){
    	string str;
    	for(int i = 3; i <= 100000; i++){
    		a[i] = (a[i - 1] + a[i - 2]) % mod;
    	}
    	
    	while(cin >> str){
    		ll fn = 0;
    		for(int i = 0; i < str.length(); i++){
    			fn = (fn * 10 + str[i] - '0') % mod;
    		}	
    		for(int i = 1; i <= 100000; i++){
    			if(fn == a[i]){
    				cout << i << endl;
    				break;
    			}
    		}
    	}
    	
    	return 0;
    } 
    
    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define clr(a,b) memset(a,b,sizeof(a))
    const ll mod=1000000007;
    map<ll,int>m;  //用了map,方便查询,可是好像没有直接暴力搜块 
    ll a[100001];
    int main()
    {
        a[1]=1,a[2]=2;
        m[1]=1,m[2]=2;
        for (int i = 3; i < 100001; ++i)
        {
            a[i]=(a[i-1]%mod+a[i-2]%mod)%mod;
            m[a[i]]=i;
        }
        string s;
        while(cin>>s)
        {
            int l=s.length();
            ll tp=0;
            for (int i = 0; i < l; ++i)
            {
                tp*=10;
                tp%=mod;
                tp+=(s[i]&15);
                tp%=mod;
            }
            cout<<m[tp]<<'
    ';
        }
    } 
    

      

  • 相关阅读:
    [iOS]一行代码集成空白页面占位图(基于runtime+MJRefresh思想)
    怎么去掉Xcode工程中的某种类型的警告 Implicit conversion loses integer precision: 'NSInteger' (aka 'long') to 'int32
    iOS悬浮窗口(无论界面跳转、View始终在视图上显示,可移动)
    开发工程中遇到的BUG
    iOS基于B站的IJKPlayer框架的流媒体探究
    iOS 快速集成ijkplayer视频直播与录播框架
    每日英语:Air Pollution From Coal Use Cuts Lifespans in China, Study Shows
    每日英语:Do Successful People Need Sleep?
    每日英语:Risk-Averse Culture Infects U.S. Workers, Entrepreneurs
    每日英语:How to find the career of your dreams
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/8409550.html
Copyright © 2011-2022 走看看