题意:给一个斐波那契数,问是斐波那契数列中的第几个,范围比较大是1到第1e5个斐波那契数
题解:选几个大质数MOD一下,预处理出范围内的所有膜后的值,如果输入的数在取模后能够和某一项斐波那契数的膜一一对应,那么他很大概率的就是它(类似hash???)
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #c81b13 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #822d0f }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #c42275 }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #0435ff }
p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000 }
span.s1 { color: #822d0f }
span.s2 { }
span.s3 { color: #c81b13 }
span.s4 { color: #0435ff }
span.s5 { color: #000000 }
span.s6 { color: #c42275 }
span.s7 { color: #78492a }
span.s8 { color: #703daa }
span.s9 { color: #539aa4 }
span.s10 { color: #3e1e81 }
#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;
}
原文地址:https://www.cnblogs.com/Mrleon/p/8683983.html