算法课 PA2 T1
题目大意
用斐波那契数列表示 \(x\) 指用斐波那契数列的不同项加起来等于 \(x\)。
给出 \(n\le 10^{12}\),问有多少种方法表示 \(n\)。
题解
第一步需要一些数学直觉,就是这种表示的数量很少,因为斐波那契数列呈指数增长,联想来说,使用 \(2^k\) 进行表示的方法甚至只有一种,因为后面的数字比前面大多了,不选 \(2^k\) 后面就很难弥补了。这一点在题目输入中也有所提示,当 \(n=10^{12}\) 时也只有 28w 种方案。
然后就是使用搜索,每次确保能搜索到一个合法的表示方案。具体来说,定义 DFS(n, k) 表示用 fib[1...k] 来表示 n 的方案数有多少。那么当 \(\sum_{i=1}^kf_i<n\) 的时候就一定没法表示,直接 return 0 即可。这样每次至少搜索到一个合法方案,时间就很快了。不然就需要 \(2^k\) 次枚举来验证每个方案,这显然是不行的。
我们又知道 \(\text{fib}_{60} > 10^{12}\),所以直接计算 DFS(n, 60) 即可。

浙公网安备 33010602011771号