【做题笔记】CF1288C Two Arrays

Problem

CF1288C Two Arrays

题目大意:

构造两个长度为 \(m\),值域为 \(n\) 的序列 \(a,b\),满足 \(a\) 单调不降,\(b\) 单调不升,且 \(\forall i \in [1,m],a_i \le b_i\),求合法方案数。

Solution

提供一种 \(O(n)\) 做法。

发现有这样三条性质:

  • \(a_1 \le a_2 \le a_3 \le \cdots \le a_m\)
  • \(b_1 \ge b_2 \ge b_3 \ge \cdots \ge b_m\)
  • \(a_m \le b_m\)

于是有:

\[a_1 \le a_2 \le a_3 \le \cdots \le a_n \le b_m \le b_{m-1} \le b_{m-2} \le \cdots \le b_1 \]

也就是说,我们把 \(b\) 翻转一下接到 \(a\) 后面,原问题就转化成了求长度为 \(2m\),值域为 \(n\) 的单调不降序列的个数。

这个问题与“将 \(2m\) 个相同的元素放到 \(n\) 个集合中,允许有集合为空的方案数”双射。

上面这个问题显然可以用插板法解决,答案为 \(\binom{2m+n-1}{n-1}\)

上面这个式子可以直接 \(O(n)\) 预处理阶乘和阶乘的逆元,然后就做完了。

posted @ 2022-09-05 08:26  Mine_King  阅读(43)  评论(0编辑  收藏  举报