/*
dp
给定一个序列,有多少个子序列是Fibonacci数列的前缀
dp[i][j]表示到第i个数为止长度为j的Fibonacci数列的前缀有多少
如果a[i]=1,dp[i][1]=dp[i-1][1]+1,dp[i][2]=dp[i-1][1]+dp[i-1][2]
其它情况,dp[i][j]=dp[i-1][j]+dp[i-1][j-1]
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
const int N = 30;
const int M = 1000001;
const int mod = 1000000007;
long long dp[M][N];
int a[M];
map<int, int>g;
int main(void)
{
int n;
int i, j;
g[1] = 2;
a[1] = a[2] = 1;
for(i = 3; i < 30; i++)
{
a[i] = a[i-1] + a[i-2];
g[a[i]] = i;//Fibonacci数->长度
}
while(~scanf("%d", &n))
{
memset(dp, 0, sizeof(dp));
for(i = 1; i <= n; i++) scanf("%d", &a[i]);
for(i = 1; i <= n; i++)
{
for(j = 1; j < 30; j++)
dp[i][j] = dp[i-1][j];
int tmp = g[ a[i] ];
if(!tmp) continue;
if(tmp == 2)
{
dp[i][1] = (dp[i][1] + 1)%mod;
dp[i][2] = (dp[i][2] + dp[i-1][1])%mod;
}
else
{
dp[i][tmp] = (dp[i][tmp] + dp[i][tmp-1])%mod;
}
}
long long ans = 0;
for(i = 1; i < 30; i++) ans = (ans + dp[n][i])%mod;
printf("%lld\n", ans);
}
return 0;
}
给定一个序列,有多少个子序列是Fibonacci数列的前缀
dp[i][j]表示到第i个数为止长度为j的Fibonacci数列的前缀有多少
如果a[i]=1,dp[i][1]=dp[i-1][1]+1,dp[i][2]=dp[i-1][1]+dp[i-1][2]
其它情况,dp[i][j]=dp[i-1][j]+dp[i-1][j-1]
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
const int N = 30;
const int M = 1000001;
const int mod = 1000000007;
long long dp[M][N];
int a[M];
map<int, int>g;
int main(void)
{
int n;
int i, j;
g[1] = 2;
a[1] = a[2] = 1;
for(i = 3; i < 30; i++)
{
a[i] = a[i-1] + a[i-2];
g[a[i]] = i;//Fibonacci数->长度
}
while(~scanf("%d", &n))
{
memset(dp, 0, sizeof(dp));
for(i = 1; i <= n; i++) scanf("%d", &a[i]);
for(i = 1; i <= n; i++)
{
for(j = 1; j < 30; j++)
dp[i][j] = dp[i-1][j];
int tmp = g[ a[i] ];
if(!tmp) continue;
if(tmp == 2)
{
dp[i][1] = (dp[i][1] + 1)%mod;
dp[i][2] = (dp[i][2] + dp[i-1][1])%mod;
}
else
{
dp[i][tmp] = (dp[i][tmp] + dp[i][tmp-1])%mod;
}
}
long long ans = 0;
for(i = 1; i < 30; i++) ans = (ans + dp[n][i])%mod;
printf("%lld\n", ans);
}
return 0;
}