退役后的诈尸。对,诈尸了。
推销博客(既然退役了就不推销了,虽然可能
github博客有更好的观赏体验)
听说没有灵魂那就没有灵魂了。
故事的开头:
退役弱鸡选手在家里听网课,下课的时候发现一位神仙学弟吐槽了
CF1097G的一部分题解。本着无所事事的原则,随手点开看了下,发现这道题好像有点眼熟。冷静思考下发现之前
noip模拟赛做过一个类似的,于是给神仙学弟讲解了下我的思路,发现我的思路的确比网上大部分题解清晰一点(雾)。然后神仙学弟又说这个技术好像能解决他之前不会的
CF1264D2,于是我又推了下那道题,发现的确可以做,而且和网上的大部分做法也有点区别。最终我就因无所事事来开了篇博客。
其实就是一条恒等式。
∑i=0t(in)(t−im)=(tn+m)
证明倒也不算复杂,构造生成函数当然是最简单的做法,从组合意义考虑隔板法也是可以的。
这条形式上来看倒也有点东西,比如说,如果
n+m是个定值,
t是个定值,很多式子倒是可以利用这条式子直接化简。同时这条式子可以解释类似
CF1097G的树形背包的正确性问题(可能是我太菜,我只会这样解释)。
就先拿
CF1097G来说。
把
k次幂用第二类斯特林数化简后,我们就是要求出
∑i=0ki!Ski∑s⊆U(if(s))
至于这个式子怎么划出来,意义是什么跟这篇博客无关,所以就不详讲了。接下来我们就是要对每一个
i=1,...,k求出后面那个东西。好像大部分题解就是简单的带过一句背包合并吧,着重放在了说明复杂度。不过在我看来这种树上背包复杂度恐怕是路人皆知的吧,反而这样合并的正确性是重中之重。
我们直接考虑
dp[x][i]表示
x这个节点求
i时的贡献。转移的确就是正常的树上背包合并,但为什么是对的呢?
考虑背包合并的本质,发现就是把一堆组合数乘起来再相加。冷静整理下,发现对于每一个下标
i,我们做的是把
j和
i−j合并起来,即
f[x][i]=∑g[j]∗f[tox][i−j],这时再考虑
(1),惊讶地发现的确会是
f[x][i](严谨证明可以归纳),于是就证明了这种背包合并的正确性。
这一类组合数的背包合并大概都可以用
(1)理解,其实还是挺有用的。
当然,组合数嘛,对于
OI而言最大的意义还是在于化简式子吧,于是引入下
CF1264D2这道题,看看化简式子有什么帮助。
这道题考虑下组合意义啥的,大概可以把答案写成这么一条式子
∑i=1n∑j=1nj(j−s1[n−i]s0[n−i])(i−j−(s1[n]−s1[n−i])s0[n]−s0[n−i])
其中
s0[i]表示前缀
?的个数,
s1[i]表示前缀
(的个数,具体这条式子怎么出来的不是这篇博客的重点,这里就不讲了。
为了接下来方便书写,我们先写成这样子
∑i=1n∑j=1nj(j−p[n−i]A[n−i])(i−j−q[n−i]B[n−i])
其中
A[i]+B[i]=S,p[i]+q[i]=T,
S,T为定值。
然后开始化简
=∑i=1n∑j=0n(j+p[n−i])(jA[n−i])(i−j−TB[n−i])
=∑i=1n∑j=0n(j(jA[n−i])(i−j−TB[n−i])+p[n−i](jA[n−i])(i−j−TB[n−i]))
=∑i=1n∑j=0nj(jA[n−i])(i−j−TB[n−i])+∑i=1n∑j=0i−Tp[n−i](jA[n−i])(i−j−TB[n−i])
=∑i=1n∑j=0nj(jA[n−i])(i−j−TB[n−i])+∑i=1np[n−i](i−TS)
=∑i=1n∑j=0nA[n−i](j−1A[n−i]−1)(i−j−TB[n−i])+∑i=1np[n−i](i−TS)
=∑i=1n∑j=0i−T−1A[n−i](jA[n−i]−1)(i−j−T−1B[n−i])+∑i=1np[n−i](i−TS)
=∑i=1n(p[n−i](i−TS)+A[n−i](i−T−1S−1))
(写得有点复杂,我背锅)
于是就得到一条
O(n)的式子了,成功地解决了此题。
同时这条式子可以对一类数进行变形,称之为
Delannoy数,写成
D(n,m),组合意义表示的是网格图中从
(0,0)走到
(n,m)的方案数(只走上、右、右上)。
我们直接考虑组合意义的话,可以得出
D(n,m)=∑i=0n(n−i)!(m−i)!i!(n+m−i)!(即枚举走
i步右上来算,这时右走了
n−i步,上走了
m−i步)。
我们写成组合数的形式,那么
D(n,m)=∑i=0n(nn+m−i)(in)
D(n,m)=∑i=0n(nn+m−i)(in)
=∑i=0n(in)∑j=0n(n−jn−i)(jm)
=∑i=0n∑j=0n(in)(n−jn−i)(jm)
=∑i=0n∑j=0n(jn)(ij)(jm)
=∑j=0n(jn)(jm)∑i=0n(ij)
=∑j=0n(jn)(jm)2j
=∑i=0n(in)(im)2i
(中间用到二项式定理)
我们发现,似乎成功将
D(n,m)换到一个不太一样的形式,但我们也不知道这样的转换有什么用。或许这对出题而言,既没有降低复杂度,也没有特殊形式,显得多余。
但这份多余,可能恰恰才是数学的魅力所在吧。
笔者水平低,随便写点东西,有错误也欢迎大家指出。