Educational Codeforces Round 83 (Rated for Div. 2)

题目链接:https://codeforces.com/contest/1312

D

可以初步观察出一些事实:
1、最大的数是只有一个的,否则不会满足左右都是严格升降序。
2、最大的数的取值范围为 \([n-1,m]\)
3、最大的数不能放在两端。
4、相等的数分布在最大的数两侧。

算法1,给位置选数

先枚举最大的数的位置,设其前面有 \(x\) 个位置,后面有 \(y\) 个位置,则 \(x\ge 0,y \ge 0,x+y=n-1\)
再枚举最大的数的取值,观察可以发现最大的数的取值是不受位置影响的,设取值为 \(p \in [n-1,m]\)
再从 \([1,p-1]\) 中选 \(x\) 个数给前面 \(x\) 个位置,选法为 \(C_{p-1}^{x}\)
再从前面 \(x\) 个数中选 \(1\) 个数作为相等的数字放在后面的某个位置, 选法为 \(C_{x}^{1}\)
再从 \([1,p-1]\) 个数中选 \(y-1\) 个数给后面剩下的 \(y-1\) 个位置,且这些数不能与前面 \(x\) 个数相等,选法为 \(C_{p-1-x}^{y-1}\)

这里会发现复杂度爆炸,但是这个形式看起来有规律。

\[ \begin{align} &C_{p-1}^{x}*C_{x}^{1}*C_{p-1-x}^{y-1} \nonumber \\ &=\frac{(p-1)!}{(p-1-x)!x!}*x*\frac{(p-1-x)!}{(p-1-x-(y-1))!(y-1)!} \nonumber \\ &=\frac{(p-1)!}{(p-n+1)!(x-1)!(y-1)!} \nonumber \\ &=\frac{1}{(x-1)!(y-1)!}*\frac{(p-1)!}{(p-n+1)!} \nonumber \\ \end{align} \]

后面的部分与 \(x,y\) 无关,前面的部分与 \(p\) 无关,两部分可以分开统计了。

算法2,给数选位置

先从 \([1,m]\) 中选出 \(n-1\) 个数,然后可以把他们离散化到 \([1,n-1]\)
然后从 \([1,n-2]\) 中选出那个相等的数(因为 \(n-1\) 是最大的数,不能相等),放在最大的数两边。
剩下的数既可以放在左边,也可以放在右边,有 \(2^{n-3}\) 种选法。

反思:怪不得这道题这么多人过,算法2是真的简单,所以以后组合数学可以从“给位置选数”以及“给数选位置”两种角度考虑。

关键是得知了: \(C_{n}^{x}*C_{n-x}^{y}\ne C_{n}^{x+y}\) 而是 \(C_{n}^{x}*C_{n-x}^{y}\ne C_{n}^{x+y}*C_{x+y}^{x}\) ,也就是说,等式左侧的规定了哪些数是去 \(x\) 中的,所以在等式右侧也要规定。

猜你喜欢

转载自www.cnblogs.com/KisekiPurin2019/p/12452921.html