• CF755G PolandBall and Many Other Balls


    Problem

      有一排(n(nleq 10^9))个球,定义一个组可以只包含一个球或者包含两个相邻的球。现在一个球只能分到一个组中,求从这些球中取出(k(k<2^{15}))组的方案数。

    Sol1(较优)

      设(f_{i,j})表示前(i)个数选了(j)组的方案数。有:

    [f_{i,j}=f_{i-1,j}+f_{i-1,j-1}+f_{i-2,j-1} ]

      构造生成函数

    [F_k(x)=sum_{igeq 0} f_{k,i}x^i ]

      由递推式,得

    [F_i(x)=(1+x)F_{i-1}(x)+xF_{i-2}(x) ]

      边界(F_0(x)=1,F_1(x)=1+x)

      对于形如(f_i=af_{i-1}+bf_{i-2})的数列,可以得到其通项公式为

    [f_n=Ax_1^n+Bx_2^n ]

      其中(x_1,x_2)为方程(x^2=ax+b)的两根,(A,B)通过待定系数法求得。

      暴力求解递推式,得到

    [F_k(x)=frac{t_1^{k+1}-t_2^{k+1}}{sqrt{x^2+6x+1}} ]

      其中(t_1,t_2)为方程(t^2=(1+x)t+x)的两根,这里(t_1)是正根,为(dfrac{1+x+sqrt{x^2+6x+1}}2)

      注意到(t_2^{n+1}equiv 0pmod{x^{n+1}}),故最终答案

    [F_{k}(x)=frac1{sqrt{x^2+6x+1}}left(frac{1+x+sqrt{x^2+6x+1}}2 ight)^{n+1} ]

      复杂度(mathcal O(klog k))

    Sol2(较劣)

      (n)的范围很大,考虑对(n)下手。

      首先,考虑合并两段序列时答案。设左边一段长度为(a),右边一段长度为(b),假设没有组跨过两段,则选取(k)组的方案数为

    [sum_{i=0}^kf_{a,i}f_{b,k-i} ]

      如果跨过中间,方案数为

    [sum_{i=0}^{k-1}f_{a-1,i}f_{b-1,k-i-1} ]

      总方案数为

    [f_{a+b,k}=sum_{i=0}^kf_{a,i}f_{b,k-i}+sum_{i=0}^{k-1}f_{a-1,i}f_{b-1,k-i-1} ]

      还是用上文的生成函数,得到

    [F_{a+b}(x)=F_a(x)F_b(x)+xF_{a-1}(x)F_{b-1}(x) ]

      代入特定的值

    [egin{cases} F_{2n}(x)=F_n^2(x)+xF_n(x)F_{n-1}(x)\ F_{2n-1}(x)=F_n(x)F_{n-1}(x)+xF_{n-1}^2(x)\ F_{2n-2}(x)=F_{n-1}^2(x)+xF_{n-1}(x)F_{n-2}(x) end{cases} ]

      发现维护({F_{n-2}(x),F_{n-1}(x),F_n(x)})可以得到({F_{2n-2}(x),F_{2n-1}(x),F_{2n}(x)})

      最后将(k)二进制分解,运用倍增以及上面的公式得到答案,复杂度(mathcal O(klog klog n)),多出了(log n)的复杂度。当然,直接对Sol1的递推式使用矩阵加速同样可以做到这个复杂度,其与Sol2无本质区别。

  • 相关阅读:
    3.List.Set
    2.Collection.泛型
    1.Object类.常用API
    MySQL-核心技术
    奇异的家族-动态规划
    动态规划-等和的分隔子集
    跳跃游戏-贪心
    跳跃游戏2
    爬楼梯
    组合博弈1536-S-Nim
  • 原文地址:https://www.cnblogs.com/ac-evil/p/13431788.html
Copyright © 2020-2023  润新知