Problem
每一个正整数都可以表示为若干个斐波那契数的和,一个整数可能存在多种不同的表示方法,例如:14 = 13 + 1 = 8 + 5 + 1,其中13 + 1是最短的表示(只用了2个斐波那契数)。定义F(n) = n的最短表示中的数字个数,F(14) = 2,F(100) = 3(100 = 3 + 8 + 89),F(16) = 2(16 = 8 + 8 = 13 + 3)。定义G(n) = F(1) + F(2) + F(3) + ...... F(n),G(6) = 1 + 1 + 1 + 2 + 1 + 2 = 8。给出若干个数字n,求对应的G(n)。
Solution
以fib个为一组找规律,发现当前fib[i]个数是前fib[i-1]个数照搬,然后前前fib[i-2]个数搬过来再+1,于是预处理fib和fib前缀和,还有sum和sum前缀和,sum[i]代表一组数,有fib[i]个,他们的F之和,然后二分找到前面成组的数,不成组的按照规律,递归求解。
Code
#include
#include
#include
#include
#include
#include
#include
#include