原題連接: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 }