营业日志 2020.10.14 K 逆序对排列计数的另一种自然求和方法

我们知道其生成函数就是 ( 1 ) ( 1 + x ) ⋯ ( 1 + x + ⋯ + x n − 1 ) (1)(1+x)\cdots(1+x+\cdots +x^{n-1}) (1)(1+x)(1+x++xn1),即

( 1 − x ) ( 1 − x 2 ) ⋯ ( 1 − x n ) ( 1 − x ) n \frac{(1-x)(1-x^2)\cdots(1-x^n)}{(1-x)^n} (1x)n(1x)(1x2)(1xn)

现在我们欲求 [ x k ] [x^k] [xk],考虑首先加入哑元 t t t,变为

f ( t ) = ( 1 − t x ) ( 1 − t x 2 ) ⋯ ( 1 − t x n ) / ( 1 − x ) n f(t)=(1-tx)(1-tx^2)\cdots(1-tx^n)/(1-x)^n f(t)=(1tx)(1tx2)(1txn)/(1x)n

实际上这个东西的系数就叫高斯二项式……不过我们还是展示一下如何推导。我们注意到 f ( t ) f(t) f(t) 有一个重要变式,就是

f ( t x ) = ( 1 − t x 2 ) ( 1 − t x 3 ) ⋯ ( 1 − t x n + 1 ) / ( 1 − x ) n = f ( t ) 1 − t x n + 1 1 − t x \begin{aligned} f(tx) &=(1-tx^2)(1-tx^3)\cdots(1-tx^{n+1})/(1-x)^n\\ &= f(t)\frac{1-tx^{n+1}}{1-tx} \end{aligned} f(tx)=(1tx2)(1tx3)(1txn+1)/(1x)n=f(t)1tx1txn+1

因此有

f ( t x ) ( 1 − t x ) = f ( t ) ( 1 − t x n + 1 ) [ t m ] f ( t x ) ( 1 − t x ) = [ t m ] f ( t ) ( 1 − t x n + 1 ) x m ( f m − f m − 1 ) = f m − x n + 1 f m − 1 ( x n + 1 − x m ) f m − 1 = ( 1 − x m ) f m f m = − x m 1 − x n − m + 1 1 − x m f m − 1 \begin{aligned} f(tx)(1-tx) &= f(t)(1-tx^{n+1})\\ [t^m]f(tx)(1-tx) &= [t^m]f(t)(1-tx^{n+1})\\ x^m(f_m-f_{m-1})&=f_m-x^{n+1}f_{m-1}\\ (x^{n+1}-x^m)f_{m-1}&=(1-x^m)f_m\\ f_m&=-x^m \frac{1-x^{n-m+1}}{1-x^m}f_{m-1} \end{aligned} f(tx)(1tx)[tm]f(tx)(1tx)xm(fmfm1)(xn+1xm)fm1fm=f(t)(1txn+1)=[tm]f(t)(1txn+1)=fmxn+1fm1=(1xm)fm=xm1xm1xnm+1fm1

注意到 f m f_m fm x m ( m + 1 ) / 2 x^{m(m+1)/2} xm(m+1)/2 的倍数,因此这个求和只需到 O ( k 1 / 2 ) O(k^{1/2}) O(k1/2) 项就停止。复杂度为 O ( k 3 / 2 ) O(k^{3/2}) O(k3/2)

这种实现在本文发表时显著优于所有分块 DP 做法。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值