「FAOI-R5」Lovely 139
题目描述
对于一个 \(\tt 01\) 串 \(S\)(下标从 \(1\) 开始),我们定义它的一个区间 \([l,r]\) 是极长颜色段,当且仅当它同时满足以下条件:
- 如果 \(l\neq 1\),\(S_{l-1}\neq S_l\);
- 如果 \(r\neq \lvert S\rvert\),\(S_{r+1}\neq S_r\);
- \(\forall i\in[l,r),S_i=S_{i+1}\)。
定义 \(g(S)\) 为 \(S\) 的不同极长颜色段数。
定义 \(f(n,m)\) 的值为所有恰好包含 \(\boldsymbol n\) 个 \(\tt 0\) 和 \(\boldsymbol m\) 个 \(\tt 1\) 的 \(\tt 01\) 串 \(S\) 的 \(g(S)\) 之和。
你需要回答 \(T\) 个问题,每次给出 \(n,m\) 的值,求 \(f(n,m)\) 的值对 \(10^9+7\) 取模后的结果。
Solution
排列组合好题!
赛时想到一个 35pts 的做法,这里讲一下。
我们考虑固定 \(g(S)\) 的答案来计数。
举例来说,\(g(S)\) 的取值为 \([1,2\times \min(n,m)+[n≠m]]\),具体请读者自证。然后我们对于 \(i∈[1,2\times \min(n,m)+[n≠m]]\),求出 \(g(S)=i\) 的 \(S\) 的数量。
不妨设 \(2\times \min(n,m)+[n≠m]=k\),现在求 \(g(S)=i\) 的 \(S\) 的数量。我们可以想象每一段极长的字段看作 \(0,1\),那么 \(S\) 就变成了 \(0101\dots 010\)。这里需要分情况讨论一下。
如果 \(2\ |\ i\),那么我们的 \(S\) 肯定为 \(0101\dots 0101\) 或者 \(1010\dots 1010\),这样我们 \(1\) 的个数有 \(\frac{i}{2}\) 个。不妨记每一个 \(1\) 中包含了 \(x_j\) 个 \(1\),每一个 \(0\) 中包含了 \(y_j\) 个 \(0\),那么则满足
注意,\(x_j,y_j∈\N_{+}\)。这样就转化为了求解上面两个不定方程的正整数解的个数了。通过很简单的组合数学知识可以得到第一个方程的解的个数为
同理,第二个方程解的个数为
所以当 \(2 \ | \ i\) 的时候,总共的满足 \(g(S)=i\) 的个数为
当然这只是数量,我们还要乘上贡献 \(i\)。
同理可以得到当 \(i\) 为奇数时的答案,因此我们的总答案为
式子可能有点丑,而且也只能拿到 35pts。下面开始讲正解
知周所众,排列组合最讲究的就是计算贡献。这里我们考虑贡献的来源是什么。
我们 \(g(S)\) 是由存在相邻的两个不相等的数字的来的,那我们不妨假设 \(S\) 的某一个位置上为 \(01\),那么显然,它会对答案贡献 \(+1\)。也就是说,对于其他 \(n+m-2\) 个位置来说,它们随便怎么排都可以,因为我已经固定了这两个位置,它们是一定会产生贡献的。所以,其它 \(n+m-2\) 个位置排列 \(n-1\) 个 \(1\) 的方案数有 \({n+m-2 \choose n-1}\),但是对于 \(n+m-1\) 个这样的相邻的一对来说,我们的贡献需要乘上 \(n+m-1\),而且 \(01\) 和 \(10\) 也是不同的,所以我们的总贡献为
但是有一点需要注意,我们在考虑完 \(x\) 对这样的 \(01\) 时,会产生 \(x+1\) 的答案,例如 \(S=0110011101\) 中有 \(5\) 对这样的 \(01\),但是 \(g(S)=6\),所以我们的总答案还要加上 \(n\) 个 \(1\),\(m\) 个 \(0\) 能组成的 \(S\) 的个数,这样的个数有 \({n+m \choose n}\) 个。
所以,我们的答案为
浙公网安备 33010602011771号