[NOI Online #2 入门组]建设城市

Description

球球是一位建筑师。一天,他收到市长的任务:建设城市。球球打算建造 $2n$ 座高楼。为了保证城市美观,球球做出了如下计划:

球球喜欢整齐的事物。他希望高楼从左向右排成一行,编号依次为 $1sim 2n$。

球球喜欢整数,他要求每座高楼的高度都是正整数。

由于材料限制,高楼的高度无法超过 $m$。

球球喜欢中间高,两边低的造型。他要求前 $n$ 座高楼的高度不下降,后 $n$ 座高楼的高度不上升。

球球打算选两座编号为 $x,y$ 的高楼作为这座城市的地标。他认为只有当这两座高楼高度相等时,才会让城市变得美观。

球球把自己的想法告诉了市长。市长希望得知所有建设城市的方案数。两种方案不同,当且仅当某座高楼的高度在两个方案中不同。这个问题可难倒了球球。球球找到了你,希望你能帮他算出答案。由于答案可能很大,你只需要给出答案对 $998244353$ 取模后的结果。

Solution

记 $h_i$ 表示第 $i$ 个楼的高度。题意就是说求满足下面三个条件的数列的个数:

  1. $h_1 le h_2 le cdots le h_n, h_{n+1} ge h_{n+2} ge cdots ge h_{2n}$
  2. $h_x = h_y$
  3. $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$,${ circcirc |circ |circcirc }$ 这种插法对应的就是 ${1, 3}$,因为我们要在每两个隔板见去掉一个。

所以,相当于是有 $n + m$ 个楼,插 $m - 1$ 个隔板的方案数。隔板显然是插在间隔里,$n + m$ 个楼有 $n+m-1$ 个间隔,所以,方案数就是:

$$ f(n, m)=inom{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) imes f(n, m) $$

  • 如果 $x, y$ 不在同一侧,不妨枚举一下 $h_x$ 等于多少,比如枚举到的是 $h_x = i$,那么序列会分为 $4$ 段:
  1. $h_1 sim h_{x - 1}$ 这 $x - 1$ 个楼应当 $in [1, i]$,所以方案数为 $f(x - 1, i)$;
  2. $h_{x+1} sim h_n$ 这 $n - x$ 个楼应当 $in[i, m]$,所以方案数为 $f(n - x, m - i + 1)$;
  3. $h_{n+1} sim h_{y-1}$ 这 $y-n-1$ 个楼应当 $in[i, m]$,所以方案数为 $f(y-n-1, m - i + 1)$;
  4. $h_{y+1} sim h_{2n}$ 这 $2n - y$ 个楼应当 $in[1, i]$,所以方案数为 $f(2n - y, i)$。

然后,对于每个 $i$ 的加起来就是了,也就是说,答案为:

$$ sum_{i=1}^{m} f(x - 1, i) imes f(n - x, m - i + 1) imes f(y-n-1, m - i + 1) imes f(2n - y, i) $$

提前 $O(n)$ 预处理阶乘和逆元,这题就解决了,情况 1 计算时间复杂度 $O(1)$,情况 2 是 $O(m)$,可以通过此题,代码就不贴了。

其实把 n 开到 1e9 也没啥呀,分块打表很香啊

原文地址:https://www.cnblogs.com/syksykCCC/p/NOIO2-J3.html