zoukankan      html  css  js  c++  java
  • [递推] hihocoder 1239 Fibonacci

    题目大意

    题目链接,给定长度为 (n) 的数组({a_i}),问有多少个子序列是斐波那契序列$ {f_i}={1,1,2,3,5,..}$ 的前缀,例如 ({1},{1,1,2})。取值范围 $nleq {10}^6,a_i leq {10}^5 $。

    算法思路

    数组 (a_i) 取值在前 (26) 个斐波那契以内,可以通过递推, (i=1..n),记录当前以 (a_i) 结尾的序列数量 (r), 设 (a_i) 是序列的第 (k) 项,则 (r_k = r_k + r_{k-1})
    举例说明, (n=5, {a_i} = {1,1,2,2,3}), 递推到 (i=5) 时,$ a_5 = 3 $,是斐波那契第 (4) 项,此时以 (f_3=2) 结尾的序列数为 (2), 那么 $r_4 = r_4+r_3 = 0 +2 = 2 $。 最后累加 $sum_{k=1}^{26} r_k $ 即可得到结果。
    需要注意的是(f_1=f_2=1), 要区分开。

    算法代码

    
    #include <iostream>
    #include <map>
    using namespace std;
    
    const int m = 26;
    int f[30];           // {1,1,2,3,5,..}
    map<int, int> fi;    // {{2,2}, {3,3}, {5,4}, {8,5}, ... }
    
    
    int n;
    int data[1000005];
    const long long int MOD = 1000000007;
    
    long long int r[26] = { 0 };
    
    int main()
    {
    	f[0] = f[1] = 1;
    	for (int k = 2; k < m; k++) {
    		f[k] = f[k - 1] + f[k - 2];
    		fi.insert(make_pair(f[k], k));
    	}
    
    	cin >> n;
    	for (int i = 1; i <= n; i++)
    		cin >> data[i];
    
    	for (int i = 1; i <= n; i++) {
    		int k = 1;
    		if (data[i] == 1) {
    			r[1] += r[0]++;
    		}
    		else if (fi.find(data[i]) != fi.end()) {
    			k = fi[data[i]];
    
    			r[k] += r[k - 1];
    			r[k] %= MOD;
    		}
    	}
    
    	long long int ans = 0;
    	for (int i = 0; i < m; i++)
    		ans = (ans + r[i]) % MOD;
    	cout << ans << endl;
    
    	return 0;
    }
    
    
  • 相关阅读:
    Java服务,内存OOM了,如何快速定位?
    Java内存分析工具MAT(Memory Analyzer Tool)安装使用实例
    jmap使用方法及原理
    可能发生Full gc 的情况
    java--jvm GC-常用参数配置
    JVM. GC 性能调优方法与思路
    《嫌疑人X的献身》——两个天才之间的思想火花
    爱的纯粹与代价
    18年下半年计划表
    阿里校招准备-总纲
  • 原文地址:https://www.cnblogs.com/lessmore/p/hihocoder-1239.html
Copyright © 2011-2022 走看看