题意:
解法:
f[i]=f[i-1]+f[i-2],发现是斐波那契数列,
但是k<=1e5,f[i]是不能直接计算出来的,给定的x很大,是一个字符串.
因为只需要判断是否相等,那么可以利用hash的思想:
令f[i][j]表示第i项模质数mod[j]的余数,多取几个模数(我取了5个).
对于给定的数x,当且仅当其对于所有j,x%mod[j]==f[i][j],那么说明x是第i项.
code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define int long long
const int maxm=1e5+5;
int mod[5]={5170427,1000000007,1000000009,12255871,163227661};
int f[maxm][5];
void init(){
for(int i=0;i<2;i++){
for(int j=0;j<5;j++){
f[i][j]=1;
}
}
for(int i=2;i<maxm;i++){
for(int j=0;j<5;j++){
f[i][j]=(f[i-1][j]+f[i-2][j])%mod[j];
}
}
}
char s[maxm];
signed main(){
init();
while(scanf("%s",s)!=EOF){
int len=strlen(s);
int a[5]={0};
for(int i=0;i<len;i++){
int t=s[i]-'0';
for(int j=0;j<5;j++){
a[j]=(a[j]*10+t)%mod[j];
}
}
for(int i=0;i<maxm;i++){
int ok=1;
for(int j=0;j<5;j++){
if(a[j]!=f[i][j]){
ok=0;
break;
}
}
if(ok){
printf("%lld\n",i);
break;
}
}
}
return 0;
}