[LOJ6671]EntropyIncreaser 与 Minecraft

题目

传送门 to LOJ

题目概要
[ x i ] F ( x ) [x^i]F(x) [xi]F(x) 表示形式幂级数 F ( x ) F(x) F(x) x i x^i xi 的系数。求
∑ i = 0 m [ x i ] ( 1 + x 1 − x ) n \sum_{i=0}^{m}[x^i]\left(\frac{1+x}{1-x}\right)^n i=0m[xi](1x1+x)n
答案对 ( 1 0 9 + 7 ) (10^9{+}7) (109+7) 取模。

数据范围与提示
既可以解决 n ⩽ 1 0 18 ∧ m ⩽ 1 0 7 n\leqslant 10^{18}\land m\leqslant 10^7 n1018m107 的情况,又可以解决 n ⩽ 1 0 7 ∧ m ⩽ 1 0 18 n\leqslant 10^7\land m\leqslant 10^{18} n107m1018 的情况。

思路

动态规划

这是一种已知结果,强行构造的 d p \tt dp dp 做法。它可以求出每一项的系数。

注意到 ( 1 + x ) n (1{+}x)^n (1+x)n 等价于 n n n 个有标号球的选择方案, 1 ( 1 − x ) n \frac{1}{(1-x)^n} (1x)n1 等价于 n n n 个有标号盒子的任意选球方案。不妨将 n n n 个有标号球分别放进一个盒子里,问题转化为:有 2 n 2n 2n 个盒子,里面的球无编号,请选出 m m m 个球,满足其中 n n n 个盒子只能选 1 1 1 个球。

现在直接开始 d p \tt dp\rm dp 吧。考虑用 ( m − 1 ) (m{-}1) (m1) 个球的方案生成 m m m 个球的方案。怎么做呢?很简单,随便找一个盒子,多选一个。也就是 2 n ⋅ f ( m − 1 ) 2n\cdot f(m{-}1) 2nf(m1) 。问题接踵而至:

  • 每个方案被计算的次数不同。如果一个 m m m 球的方案中,有 k k k 个盒子拿了至少一个球,那么它被计算到的次数是 k k k

想办法 “填平” 每个方案的计算次数。一个方案只会被计算 k k k 次的原因是,并不是所有的球都可以是 ( m − 1 ) (m{-}1) (m1) 球的方案的转移中新加入的球。那么我们就强迫它们可以!只要所有的球都可能成为新加入的球,方案的系数就是 m m m,直接作除法即可。

然而强迫的时候,还要让它不是原本就计算过的、盒子中 “最顶端” 的球(每个盒子本来只有一个球是可以成为新加球的)。最好的方法就是 二者都选,即,选出 “最顶端” 的球之后再选一个同盒子内的球。显然再选出的一个就不是 “最顶端” 的球了。

这样的方案怎么得到呢?肯定是 ( m − 2 ) (m{-}2) (m2) 球的方案,然后在同一个盒子里多选两个。考虑一个 ( m − 2 ) (m{-}2) (m2) 球方案中,选了 x x x 个球的盒子,如果要在这个盒子里多选两个,方案的系数应当为 ( x + 1 ) (x{+}1) (x+1),即 “最顶端” 是固定的,但是剩下的一个可能是原本的 ( x + 1 ) (x{+}1) (x+1) 个 “非顶端“ 中的任意一个。总系数为 ∑ ( x + 1 ) = ( m − 2 ) + 2 n \sum(x{+}1)=(m{-}2)+2n (x+1)=(m2)+2n,所以我们初步认为
f ( m ) = 2 n ⋅ f ( m − 1 ) + ( 2 n + m − 2 ) f ( m − 2 ) m f(m)=\frac{2n\cdot f(m{-}1)+(2n{+}m{-}2)f(m{-}2)}{m} f(m)=m2nf(m1)+(2n+m2)f(m2)
若没有 “其中 n n n 个盒子至多选一个球” 的约束,则 f ( m ) = ( 2 n + m − 1 m ) f(m)={2n+m-1\choose m} f(m)=(m2n+m1) 便满足上面的递推式。读者可自行验证。所以我们要解决第二个问题:

  • 非法方案也被统计了。

非法方案必定是某个 “特殊盒子”(至多选一个球的)选了 2 2 2 3 3 3 个球。选 2 2 2 个球,会在 f ( m − 1 ) f(m{-}1) f(m1) 中统计一次,在 f ( m − 2 ) f(m{-}2) f(m2) 中统计一次;选 3 3 3 个球,会在 f ( m − 2 ) f(m{-}2) f(m2) 中统计两次。所以我们发现,非法方案的系数一定是 2 2 2 。这是个美丽的巧合吗?

f ( m − 2 ) f(m{-}2) f(m2) 中随便选一个 “特殊盒子” 多放两个球,就得到所有非法方案。其系数是 2 2 2,所以只需减去 2 n ⋅ f ( m − 2 ) 2n\cdot f(m{-}2) 2nf(m2) 。综上所述
f ( m ) = 2 n ⋅ f ( m − 1 ) + ( m − 2 ) ⋅ f ( m − 2 ) m f(m)=\frac{2n\cdot f(m{\rm-}1)+(m{\rm-}2)\cdot f(m{\rm-}2)}{m} f(m)=m2nf(m1)+(m2)f(m2)
其中 f ( m ) f(m) f(m) m m m 球的方案。递推即可,时间复杂度 O ( m ) \mathcal O(m) O(m)

生成函数

或许它是如 O U Y E \sf OUYE OUYE 等强者的做法;或许它是我知道结果之后生硬构造的解释。

G ( x ) = ( 1 + x 1 − x ) n G(x)=({1+x\over 1-x})^n G(x)=(1x1+x)n,则有
G ′ ( x ) = n ⋅ ( 1 + x ) n − 1 ( 1 − x ) n + n ⋅ ( 1 + x ) n ( 1 − x ) n + 1 ⇒ G ′ ( x ) = ( 1 1 + x + 1 1 − x ) n G ( x ) = 2 n 1 − x 2 G ( x ) \begin{aligned} G'(x) &={n\cdot (1+x)^{n-1}\over(1-x)^n}+{n\cdot (1+x)^n\over(1-x)^{n+1}}\\ \Rightarrow G'(x) &=\left(\frac{1}{1+x}+\frac{1}{1-x}\right)nG(x)\\ &=\frac{2n}{1-x^2}G(x) \end{aligned} G(x)G(x)=(1x)nn(1+x)n1+(1x)n+1n(1+x)n=(1+x1+1x1)nG(x)=1x22nG(x)
移项后得 G ′ ( x ) = x 2 G ′ ( x ) + G ( x ) G'(x)=x^2G'(x)+G(x) G(x)=x2G(x)+G(x),这与 动态规划 的式子等价。

暴力展开

只需计算 [ x m ] ( 1 + x ) n ( 1 − x ) n + 1 [x^m]{(1+x)^n\over(1-x)^{n+1}} [xm](1x)n+1(1+x)n 。由于 ( 1 + x ) n (1{+}x)^n (1+x)n 1 ( 1 − x ) n + 1 1\over(1-x)^{n+1} (1x)n+11 的任意项系数都是可以快速计算的,直接 O ( n ) \mathcal O(n) O(n) 枚举 ( 1 + x ) n (1{+}x)^n (1+x)n 中的每一项即可。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值