题意是求给定的数是
Ak(1≤k≤105)
A
k
(
1
≤
k
≤
10
5
)
中的第几项。
可以通过先计算出
Ak
A
k
模多个质数的答案,然后对输入的数也模这些质数,然后在
Ak
A
k
中扫描,若相同,则认为概率很大是那个数。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll> p={998244353, 1000000007, 19260817, 100000037, 100000007};
ll res[5][100007];
char s[100007];
int main()
{
for(int i=0;i<5;++i)
{
res[i][0]=res[i][1]=1;
for(int j=2;j<=100000;++j)
res[i][j]=(res[i][j-1]+res[i][j-2])%p[i];
}
while(~scanf("%s",s))
{
ll k[5];
memset(k,0,sizeof(k));
int n=strlen(s);
for(int i=0;i<n;++i)
{
for(int j=0;j<5;++j)
k[j]=(k[j]*10+s[i]-'0')%p[j];
}
for(int i=1;i<=100000;++i)
{
bool ok=true;
for(int j=0;j<5;++j)
if(k[j]!=res[j][i]) {ok=false; break;}
if(ok)
{
printf("%d\n",i);
break;
}
}
}
return 0;
}