(dp)hihocoder - 1239 Fibonacci

原題連接:http://hihocoder.com/problemset/problem/1239ios


 

題意:給一個數列,求構成斐波那契數列的子序列有幾個。spa


 

分析:咱們能夠在統計的過程當中動態加出結果。code

因爲有兩個1,咱們須要進行一些區分,咱們首先定義m[0]表示以第一個1爲結尾的斐波那契數列的個數,m[1]表示以第二個1爲結尾的斐波那契數列的個數,同理,m[i](i>1,i表示斐波那契數的編號)表示以Fibonacci(i)爲結尾的斐波那契數列的個數。blog

好比這個例子1 1 2 1 2 3 4 5 。ci

①假設一開始1,這時m[0]=1。string

②接着又一個1,這時因爲m[0]=1以前已經有一個以第一個1爲結尾的數列,因此m[1]+=m[0],又因爲1單獨自身能成爲一個數列,因此m[0]+=1。it

③接下來是2,咱們須要看他前面那個斐波那契數,也就是第二個1,因此m[2]+=m[1]。io

④而後是又是1,跟②同樣,先加上已經有的,而後加上本身新的。m[1]+=m[0],m[0]+=1。class

⑤依然是2,跟③同樣,m[2]+=m[1]。stream

⑥而後是3,跟③⑤相似,m[3]+=m[2]。

⑦此次是4,發現不是斐波那契數,直接跳過。

⑧最後是5,依然相似,m[4]+=m[3]。


代碼:

 1 #include <set>
 2 #include <map>
 3 #include <list>
 4 #include <cmath>
 5 #include <queue>
 6 #include <vector>
 7 #include <bitset>
 8 #include <string>
 9 #include <cctype>
10 #include <cstdio>
11 #include <cstring>
12 #include <cstdlib>
13 #include <iostream>
14 #include <algorithm>
15 
16 using namespace std;
17 
18 typedef long long ll;
19 typedef unsigned long long ull;
20 #define inf (0x3f3f3f3f)
21 #define lnf (0x3f3f3f3f3f3f3f3f)
22 #define eps (1e-8)
23 int sgn(double a) {return a < -eps ? -1 : a < eps ? 0 : 1;}
24 
25 //--------------------------
26 
27 
28 const ll mod = 1000000007;
29 
30 int fb[30] = {1, 1, 2};
31 ll tb[30];
32 map<int, int> m;
33 int p;
34 int n;
35 
36 void init() {
37     m[1] = 1;
38     m[2] = 2;
39     for (p = 3;; p++) {
40         if (fb[p - 1] + fb[p - 2] > 100000)break;
41         fb[p] = fb[p - 1] + fb[p - 2];
42         m[fb[p]] = p;
43 
44     }
45 }
46 
47 
48 
49 void solve() {
50     init();
51     while (~scanf("%d", &n)) {
52         memset(tb, 0, sizeof(tb));
53         ll ans = 0;
54         int x;
55         int k = 0;
56         for (int i = 0; i < n; i++) {
57             scanf("%d", &x);
58 
59             int *lo = lower_bound(fb, fb + p, x);
60             if (*lo != x) continue;
61             if (x == 1) {
62                 ans = (ans % mod + tb[0] % mod) % mod;
63                 tb[1] = (tb[1] % mod + tb[0] % mod) % mod;
64                 tb[0] = (tb[0] % mod + 1) % mod;
65                 ans = (ans % mod + 1) % mod;
66             } else {
67                 tb[m[x]] = (tb[m[x]] % mod + tb[m[x] - 1] % mod) % mod;
68                 ans = (ans % mod + tb[m[x] - 1] % mod) % mod;
69             }
70         }
71 
72         printf("%lld\n", ans );
73     }
74 
75 }
76 
77 int main() {
78 
79 #ifndef ONLINE_JUDGE
80     freopen("1.in", "r", stdin);
81     //freopen("1.out", "w", stdout);
82 #endif
83     //iostream::sync_with_stdio(false);
84     solve();
85     return 0;
86 }
相關文章
相關標籤/搜索