EOJ 3506. 斐波那契数列

题意:给一个斐波那契数,问是斐波那契数列中的第几个,范围比较大是1到第1e5个斐波那契数

题解:选几个大质数MOD一下,预处理出范围内的所有膜后的值,如果输入的数在取模后能够和某一项斐波那契数的膜一一对应,那么他很大概率的就是它

#include <iostream>

#include <cstring>

#define ll long long

#define fio ios::sync_with_stdio(false);cin.tie(0)

const int N=2e5+5;

using namespace std;

int mod[]={10000019,99999721,10006333,1006277,10005559,99999787};

int a[N][6];

int main(){

    fio;

    for(int i=0;i<6;i++){

        a[1][i]=1,a[2][i]=2;

        for(int j=3;j<=100000;j++){

            a[j][i]=(a[j-1][i]+a[j-2][i])%mod[i];

        }

    }

    string str;

    ll cm[6];

    while(cin>>str){

        memset(cm,0,sizeof(cm));

        int len=str.length();

        for(int i=0;i<len;i++){

            for(int j=0;j<6;j++){

                cm[j]=(cm[j]*10+str[i]-'0')%mod[j];

            }

        }

        for(int i=1;i<=100000;i++){

            int flag=0;

            for(int j=0;j<6;j++){

                if(cm[j]!=a[i][j]){

                    flag=1;

                    break;

                }

            }

            if(flag==0){

                cout<<i<<endl;

                break;

            }

        }

    }

    return 0;

}

  

posted @ 2018-03-31 20:10  采蘑菇的小西佬  阅读(215)  评论(0编辑  收藏  举报