[NOI Online #2 入门组]建设城市
Description
球球是一位建筑师。一天,他收到市长的任务:建设城市。球球打算建造 $2n$ 座高楼。为了保证城市美观,球球做出了如下计划:
球球喜欢整齐的事物。他希望高楼从左向右排成一行,编号依次为 $1\sim 2n$。
球球喜欢整数,他要求每座高楼的高度都是正整数。
由于材料限制,高楼的高度无法超过 $m$。
球球喜欢中间高,两边低的造型。他要求前 $n$ 座高楼的高度不下降,后 $n$ 座高楼的高度不上升。
球球打算选两座编号为 $x,y$ 的高楼作为这座城市的地标。他认为只有当这两座高楼高度相等时,才会让城市变得美观。
球球把自己的想法告诉了市长。市长希望得知所有建设城市的方案数。两种方案不同,当且仅当某座高楼的高度在两个方案中不同。这个问题可难倒了球球。球球找到了你,希望你能帮他算出答案。由于答案可能很大,你只需要给出答案对 $998244353$ 取模后的结果。
Solution
记 $h_i$ 表示第 $i$ 个楼的高度。题意就是说求满足下面三个条件的数列的个数:
- $h_1 \le h_2 \le \cdots \le h_n, h_{n+1} \ge h_{n+2} \ge \cdots \ge h_{2n}$
- $h_x = h_y$
- $\forall 1 \le i \le 2n, h_i \in [1, m]$
如果没有 $h_x = h_y$ 的限制,方案数应该是什么呢?
显然上升部分和下降部分的方案数是相等的,我们只考虑前面一个部分(也就是用 $[1, m]$ 拼长度为 $n$ 的不下降序列的方案数 $f(n, m)$)。利用隔板法的思想,可以先把楼排成一行,在中间依次插上 $m - 1$ 个隔板,相邻两个隔板之间的楼的高度相等,求不同的插法。
当然,这时可能会有多个隔板在一个位置,比如楼房高度为 $\{1, 1, 3\}$ 时,隔板的插法就是 $\{ \circ \circ \ |\ |\ \circ \}$。
这违背了隔板法的要求,所以我们加 $m$ 个楼进去,确保这些新加的楼的高度分别为 $1 \sim m$,然后就可以用隔板法了。
比如 $m = 3$,$\{ \circ\circ |\circ |\circ\circ \}$ 这种插法对应的就是 $\{1, 3\}$,因为我们要在每两个隔板见去掉一个。
所以,相当于是有 $n + m$ 个楼,插 $m - 1$ 个隔板的方案数。隔板显然是插在间隔里,$n + m$ 个楼有 $n+m-1$ 个间隔,所以,方案数就是:
$$ f(n, m)=\binom{n+m-1}{m-1} $$
接下来,考虑加上 $h_x = h_y$ 的条件。
- 如果 $x, y$ 在同一侧,那么显然 $h_x , h_{x+1} \cdots h_y$ 都是相等的,可以视作一个楼(所以少了 $y - x$ 个楼),所以,这一侧的方案数就是 $f(n - (y - x), m) = f(n + x - y, m)$,另一侧不变,也就是 $f(n, m)$。综上,答案为:
$$ f(n+x-y, m) \times f(n, m) $$
- 如果 $x, y$ 不在同一侧,不妨枚举一下 $h_x$ 等于多少,比如枚举到的是 $h_x = i$,那么序列会分为 $4$ 段:
- $h_1 \sim h_{x - 1}$ 这 $x - 1$ 个楼应当 $\in [1, i]$,所以方案数为 $f(x - 1, i)$;
- $h_{x+1} \sim h_n$ 这 $n - x$ 个楼应当 $\in[i, m]$,所以方案数为 $f(n - x, m - i + 1)$;
- $h_{n+1} \sim h_{y-1}$ 这 $y-n-1$ 个楼应当 $\in[i, m]$,所以方案数为 $f(y-n-1, m - i + 1)$;
- $h_{y+1} \sim h_{2n}$ 这 $2n - y$ 个楼应当 $\in[1, i]$,所以方案数为 $f(2n - y, i)$。
然后,对于每个 $i$ 的加起来就是了,也就是说,答案为:
$$ \sum_{i=1}^{m} f(x - 1, i) \times f(n - x, m - i + 1) \times f(y-n-1, m - i + 1) \times f(2n - y, i) $$
提前 $O(n)$ 预处理阶乘和逆元,这题就解决了,情况 1 计算时间复杂度 $O(1)$,情况 2 是 $O(m)$,可以通过此题,代码就不贴了。
其实把 n 开到 1e9 也没啥呀,分块打表很香啊