Educational Codeforces Round 133 F – Bags with Balls
题目中存在高次项的和。则我们分别计算有 p=1,2,⋯,n 个袋子选择奇数号球时的方案。对于选择了奇数号球的袋子,每个有 ⌈2m⌉ 种选择;偶数的则有 ⌊2m⌋ 种。因此答案为:
p=0∑npk(pn)⌈2m⌉p⌊2m⌋n−p
由于 n≤109,这式子看起来非常棘手。但我们注意到,有 k≤2000,这提示我们或许应该转变对答案的贡献方式:从高次幂入手,找到 O(polyk) 而非 O(n) 的算法。
引理
有非负整数 x,k,n,则
p=0∑n(pn)xppk=t=1∑kntxt(x+1)n−tS2(k,t)
其中 nt=∏i=0t−1n−i 表示 n 的 t 次下降幂,S2(k,t) 表示第二类斯特林数。
证明
对于 k=0,该式子的解是平凡的:∑p=0n(pn)xp 是 (x+1)n 的展开形式。
对于 k=1,我们考虑拆分二项式系数:
=====p=0∑n(pn)pxpp=0∑n(n−p)!p!n!pxpp=0∑n(n−p)!(p−1)!n⋅(n−1)!xpp=0∑nn[(n−1)−(p−1)]!(p−1)!(n−1)!xpp=0∑nnx(p−1n−1)xp−1 nx(x+1)n−1(1)
对于 k=2,我们故技重施:
=====p=0∑n(pn)p2xpp=0∑n(pn)pxp⋅pp=0∑nnx(p−1n−1)xp−1pp=0∑nnx(p−1n−1)xp−1[1+(p−1)]p=0∑nnx(p−1n−1)xp−1+n(n−1)x2(p−2n−2)xp−2nx(x+1)n−1+n(n−1)x2(x+1)n−2(由式(1)得)
情况变得明朗了。可以发现,k 每自增 1,也即将原式乘上因数 p,我们都会将上一代式子的所有二项式系数再度拆分,并且结果可以表示成 k 个特定二项式系数、n 的下降幂和 x 的高次幂的乘积式之和。同时,更一般地,有(p−tn−t)p=t(p−tn−t)+(n−t)(p−t−1n−t−1)(2),这就是 n 的下降幂产生的原因。
现在使用数学归纳法:假如对于 k=k0,有
p=0∑n(pn)xppk0=t=1∑k0ck0,tntxt(x+1)n−t(p−tn−t)成立(ck,t 为给定的 k,t 下该项的正整数系数,目前还没有发现其内在联系),那么对于 k=k0+1,有
===p=0∑n(pn)xppk0+1t=1∑k0ck0,tntxt(x+1)n−t(p−tn−t)⋅pt=1∑k0ck0,t[ntxt(x+1)n−t(p−tn−t)t+(nt(n−t))xt+1(x+1)n−t−1(p−(t+1)n−(t+1))]t=1∑k0+1(tck0,t+ck0,t−1)ntxt(x+1)n−t(p−tn−t)(由式(2)得)
令 ck0+1,t=ck0,t⋅t+ck0,t−1,则对于 k=k0+1 也成立。
c 的转移方式,不正是第二类斯特林数的递推式么?!同时具有 c1,1=1。故原式成立。□
现在回到本题。我们令 x=⌊2m⌋⌈2m⌉,则答案为 ⌊2m⌋nt=1∑kntxt(x+1)n−tS2(k,t)
以 O(kmax2) 的时间计算好第二类斯特林数,预处理好逆元和幂次等,单次询问时间复杂度 O(k)。
Submission #167165456