题意
给定(n),求(n)分成若干个不同的斐波那契数的方案数。(nle 10^{18})
做法
定义1:令自然数被不同的斐波那契数表示的方法为斐波那契表示
结论1:任何自然数都有斐波那契表示
归纳显然
结论2:任何自然数的斐波那契表示,从大的那项向小的,不断将相邻两项合并,最后形成的是唯一的不相邻的斐波那契表示
证明:
不会有两项相同的可以手玩一下。
如果相邻则还可以合并。
若不是唯一的,因为最后是不相邻的,考虑两种表示中最大的的数较大的那项,另一个表示所有数加起来都不会比其大
所以我们可以把贪心的从大到小分解(n),得到(f_{pos_1},f_{pos_2},...,f_{pos_m})(是从(pos_m)开始分解的),(.s.t~sumlimits_{i=1}^m f_{pos_i}=n)
结论3:若将(f_{pos_i})分解为(f_{pos_{i}-2},f_{pos_{i}-1}),则(f_{pos_{i}-1})将不能再分解
归纳显然
现在考虑将这个序列从(pos_1sim pos_m)分解,可以发现(pos_i)若确定要分解成小的,根据结论3,可以分解的区间在((pos_{i-1},pos_i))或([pos_{i-1},pos_i)),具体的区间边界,在于(pos_{i-1})是否分解了
结论4:对于(f_k),若要分解的区间在(f_{[l,k)}),则分解的方案数为(frac{k-l}{2})
枚举左端点即可
令(g_{i,0/1})表示考虑完(f_{pos_i})后,(f_{pos_i})是否分解的方案数