-
6 2 1 1 2 2 3
样例输出
-
7
Given a sequence {an}, how many non-empty sub-sequence of it is a prefix of fibonacci sequence.
A sub-sequence is a sequence that can be derived from another sequence by deleting some elements without changing the order of the remaining elements.
The fibonacci sequence is defined as below:
F1 = 1, F2 = 1
Fn = Fn-1 + Fn-2, n>=3
输入
One line with an integer n.
Second line with n integers, indicating the sequence {an}.
For 30% of the data, n<=10.
For 60% of the data, n<=1000.
For 100% of the data, n<=1000000, 0<=ai<=100000.
输出
One line with an integer, indicating the answer modulo 1,000,000,007.
样例提示
The 7 sub-sequences are:
{a2}
{a3}
{a2, a3}
{a2, a3, a4}
{a2, a3, a5}
{a2, a3, a4, a6}
{a2, a3, a5, a6}
if(a[i]==1)
{
num1++;// //num1代表当前有多少个1
count[2]=num1*(num1-1)/2;/*因为斐波那契数列前两个数都为1,所以以第二个斐波那契数结尾的结果就是
num1*(num1-1)/2;*/
count[2]%=1000000007;
count[1]=num1;//所以以第一个斐波那契数结尾的结果就是num1
}
最后把所有count[1]加到count[k]取模就是最后答案。k的话估计下就好了。不会很大。
#include<iostream>
using namespace std;
int f[1000005];
int num[1000005];
int a[1000005];
int pos[1000005];
long long count[1000005];
int main()
{
f[1]=1;
f[2]=1;
pos[1]=1;
pos[2]=2;
for(int i=3;f[i-1]<1000005;i++)
{
f[i]=f[i-1]+f[i-2];
pos[f[i]]=i;
}
//cout<<f[4]<<endl;
int n;
while(~scanf("%d",&n))
{
//memset(pos,0,sizeof(pos));
int nn=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&num[i]);
if(pos[num[i]]!=0)
{
a[++nn]=num[i];
}
}
//cout<<nn<<endl;
long long num1=0;
for(int i=1;i<=nn;i++)
{
if(a[i]==1)
{
num1++;// //num1代表当前有多少个1
count[2]=num1*(num1-1)/2;/*因为斐波那契数列前两个数都为1,所以以第二个斐波那契数结尾的结果就是
num1*(num1-1)/2;*/
count[2]%=1000000007;
count[1]=num1;//所以以第一个斐波那契数结尾的结果就是num1
}
else
{
count[pos[a[i]]]+=count[pos[a[i]]-1];
count[pos[a[i]]]%=1000000007;
}
}
long long ans=0;
for(int i=1;i<50;i++)
{
ans+=count[i];
ans%= 1000000007;
}
printf("%lld\n",ans);
}
}