• [BJOI2012]最多的方案


    题意

    给定(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})是否分解的方案数

  • 相关阅读:
    1099. Build A Binary Search Tree (30)
    两个新事物
    time.h
    Nohup命令
    进程锁
    C++中虚析构函数的作用
    c++ 修改stl set中的元素
    STL迭代器辅助函数——advance
    CTreeCtrl 控件使用总结
    关于stl advance函数移动步数超过容器大小(越界)的研究
  • 原文地址:https://www.cnblogs.com/Grice/p/12869696.html
Copyright © 2020-2023  润新知