问题描述
给定一个数组,其中数子小于10000, 求fibonacci 子串的个数。
解法
容易想到如果当前数字是fibonacci数列中的一个,那么以其结尾的fibonacci 子串个数为前一个fibonacci数字前一个的子串的个数。如果当前数字不是fibonacci 数列中的数字,则不需要考虑。
代码
#include <bits/stdc++.h>
using namespace std;
enum{maxn = 1000006, Mod=1000000007};
int f[maxn];
int num[maxn];
int n;
int bsearch(int a)
{
int l =1, r = n;
while(l<=r)
{
int m = l+(r-l)/2;
if (f[m] == a)
return m;
if (f[m] < a)
l = m+1;
else
r = m-1;
}
return 0;
}
int main()
{
//freopen("in.txt", "r", stdin);
memset(num, 0, sizeof(num));
f[1] = f[2] = 1;
for (int i=3; i<maxn; ++i)
f[i] = f[i-1] + f[i-2];
scanf("%d", &n);
for (int i=0; i< n; ++i)
{
int a;
scanf("%d", &a);
if (a==1)
{
num[2] = (num[2] + num[1]) %Mod;
num[1] = (num[1] +1)%Mod;
}
else
{
int p = bsearch(a);
if (p)
{
num[p] = (num[p] + num[p-1])%Mod;
}
}
}
int ret =0;
for (int i=1; i<maxn; ++i)
ret = (ret + num[i])%Mod;
printf("%d\n", ret);
return 0;
}
注意
1需要特殊考虑,因为fibonacci 中有两个1;