首先,所有不同的操作方式是很好求的。但是不同操作序列并不正好对应一种不同的网格。
考虑什么情况下两个操作序列不同但是求出了不同的网格。如果出现了这种情况:
plaintext
1 | 0 0 1 0 |
那么明显,要么第三行 +3 ,第三列 +2 或者 第三行 +2 第三列 +3 ,会出现两种不同的状况。
除开这种情况,不会有出现两种不同操作序列对应同一个网格图了。神仙zjk已经教了我一个绝妙的证明,可惜我懒得写下来了(逃
我们将一个导致操作序列出现不同的位置称为一个拐角,那么很明显,同一列或同一行不会出现超过一个拐角。因为在 (i,j) 出现拐角,也就是这里导致了 i 行,j 列有两种不同的操作方式,那么 (i+1,j) 和 (i,j+1) 必然都是 0 (否则并不能对应两个不同的操作方式)。
设 fi 为钦定了 i 个拐角的网格图的数量。 fi 是很好求的,选择 i 行 i 列后进行排列一下即可
fi=(ni)(mi)i!(n+1)m−i(m+1)n−i设 f′i 为钦定了 i 个拐角的操作序列的数量,于是我们知道
f′i=2ifi然后设 gi 是正好 i 个拐角的操作序列的数量。可以二项式反演一下有
f′i=∑j≥i(ji)gj⇔gi=∑j≥i(ji)(−1)j−if′j我们要求的是
∑i≥0gi2i推式子:
=∑i≥0gi2i=∑i≥012i∑j≥i(ji)(−1)j−if′j=∑i≥012i∑j≥i(ji)(−1)j−ifj2j=∑j≥0fj∑i≤j(ji)(−1)j−i2j−i=∑j≥0fj(−1)j最后是一个二项式定理。
cpp
1 |
|