分析:
dp[i][j]
表示前i个数,以第
j
个斐波那契数为结尾的前缀子序列有多少个。转移好想。
这里主要是在
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define pr(x) cout << #x << ": " << x << " "
#define pl(x) cout << #x << ": " << x << endl;
typedef long long ll;
struct jibancanyang
{
int rnk[112345], n, A[1123456];
ll dp[1123456][26], mod = int(1e9) + 7;
void pre() {
memset(rnk, 0, sizeof(rnk));
int a = 1, b = 1, cnt = 1;
while (b <= 100000) {
rnk[b] = cnt++;
int t = a;
a = b;
b = t + b;
}
}
void fun() {
pre();
scanf("%d", &n);
for (int i = 1; i <= n; ++i) scanf("%d", &A[i]);
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; ++i) {
int r = rnk[A[i]];
for (int j = 0; j <= 25; ++j) {
dp[i][j] = dp[i - 1][j];
if (j == r) {
if (r != 1)
dp[i][j] += dp[i - 1][j - 1];
else {
dp[i][0]++;
dp[i][j] += dp[i - 1][0];
}
}
dp[i][j] %= mod;
}
}
ll ans = 0;
for (int i = 0; i <= 25; ++i) {
ans = (ans + dp[n][i]) % mod;
}
printf("%lld\n", ans);
}
}ac;
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
#endif
ac.fun();
return 0;
}