hiho 113 Fibonacci

问题描述

给定一个数组,其中数子小于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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值