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;
}