题意
给定\(n\),求\(n\)分成若干个不同的斐波那契数的方案数。\(n\le 10^{18}\)
做法
定义1:令自然数被不同的斐波那契数表示的方法为斐波那契表示
结论1:任何自然数都有斐波那契表示
归纳显然
结论2:任何自然数的斐波那契表示,从大的那项向小的,不断将相邻两项合并,最后形成的是唯一的不相邻的斐波那契表示
证明:
不会有两项相同的可以手玩一下。
如果相邻则还可以合并。
若不是唯一的,因为最后是不相邻的,考虑两种表示中最大的的数较大的那项,另一个表示所有数加起来都不会比其大
所以我们可以把贪心的从大到小分解\(n\),得到\(f_{pos_1},f_{pos_2},...,f_{pos_m}\)(是从\(pos_m\)开始分解的),\(.s.t~\sum\limits_{i=1}^m f_{pos_i}=n\)
结论3:若将\(f_{pos_i}\)分解为\(f_{pos_{i}-2},f_{pos_{i}-1}\),则\(f_{pos_{i}-1}\)将不能再分解
归纳显然
现在考虑将这个序列从\(pos_1\sim 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}\)是否分解的方案数