hiho 113 Fibonacci

原创 2016年08月28日 22:07:13

问题描述

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

113. Path Sum II

Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su...

转载自zhaohongyu113 的linux监控程序-程序自动重启方法

使用脚本实现自动重启 首先想到的最简单的使用shell脚本,大概思路: ps -ef | grep “$1″ | grep -v “grep” | wc –l 是获取 $1 ($1 代表进...

[Leetcode 113, Medium] Path sum II

[Leetcode 113, Medium] Path sum II

56. Merge Intervals\113. Path Sum II\211. Add and Search Word - Data structure design

Merge Intervals 题目描述 代码实现 Path Sum II 题目描述 代码实现56. Merge Intervals题目描述Given a collection of interval...

CF 113B || CF196D

watashi大神的代码 #include #include #include #include using namespace std; vector pos(const stri...

Leetcode[113]-Path Sum II

Given a binary tree and a sum, find all root-to-leaf paths where each path’s sum equals the given su...

凸包的几种算法 主要Graham-Scan算法的水平序法 另加poj113 wall的解题

在说这个题目之前,我想给大家介绍一些这几天我了解到的有关凸包的知识: 1、Gift-Wrapping(卷包裹算法) 这个算法在《算法艺术》上说的很清楚了(p391-393),如果理解的还不是很清楚...

uva 113 Power of Cryptography

Power of Cryptography       题目大意:k ^ n = q. 求n. 解题思路:double的上限是1.7e+308,完全够。   #include #include in...

UVa Problem 113 - Power of Cryptography

// UVa Problem 113 - Power of Cryptography // Verdict: Accepted // Submission Date: 2011-11-25 // UV...

[C++]LeetCode: 113 Word Break II (DP && Backtacking) 求解拆分组合

题目: Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)