列一列(哈希思想)
题目链接:列一列
给定 一个类似斐波那契的数列的前100000项的具体结果 ( 注意是结果,不是第多少项求结果),让你判断给定的这个结果是这个数列的第多少项。(输入太大要以字符串的形式输入后再进行处理))
由于早已经超long long,利用Hash的思想,取模后保存结果,后面遍历验证
这里使用了3个质数取模来共同验证,比较保险。实测一个1000000009也可以过
#include<bits/stdc++.h>
#define ull unsigned long long
using namespace std;
ull mod[10]= {1000000009,1000000007,90000877};
ull a[100019][6];
char ch[1000019];
int main()
{
for(int i=0; i<3; i++)
{
a[1][i]=1;
a[2][i]=2;
}
for(int i=3; i<=100001; i++) // 预处理
{
for(int j=0; j<3; j++)
{
a[i][j]=(a[i-1][j]+a[i-2][j])%mod[j];
}
}
while(scanf("%s",ch)!=EOF)
{
int len=strlen(ch);
ull jd[5];
for(int i=0; i<3; i++)
{
ull ans=0;
for(int j=0; j<len; j++)
{
ans=(ans*10+ch[j]-'0')%mod[i];
}
jd[i]=ans;
}
for(int i=1; i<=100001; i++)
{
int flag=1;
for(int j=0; j<3; j++)
{
if(a[i][j]!=jd[j])
flag=0;
}
if(flag)
{
printf("%d\n",i);
break;
}
}
}
return 0;
}