2023.3.3 JOISC2018 Day2 模拟赛题解

T1 Asceticism

题意:

求有多少 \(n\) 阶排列 \(p\) ,使得 \(\sum\limits_{i=1}^{n-1}[p_i>p_{i+1}]=k-1\) ,对 \(10^9+7\) 取模.

\(1\leq k\leq n\leq 10^6\) .

思路:

\(\textbf{Subtask 1}\sim\textbf{3: 4+20+25 pts}\)

\(f_{i,j}\) 表示目前排列里有了 \(1\sim i\) 中的数字,目前共有 \(j\)\(p_x>p_{x+1}\) 的排列方案数.

考虑如何转移. 我们可以由 \(f_{i-1,j}\)\(f_{i-1,j-1}\) 转移至 \(f_{i,j}\) ,就相当于,目前排列里只有 \(1\sim i-1\) 的数,我们现在要插入一个数 \(i\) ,然后考虑其对排列造成的影响. 当将 \(i\) 插入排列时,由于 \(i\) 是目前排列中最大的,则有 \(j\) 种插入方法使 \(j\) 不改变,也就是插入到每一组 \(p_x>p_{x+1}\)\(p_x\) 的后面;而又有 \(i-j\) 种插入方式使 \(j\) 变为 \(j+1\) ,即不插入到使 \(j\) 不改变的位置,于是有

\[f_{i,j}=j\cdot f_{i-1,j}+(i-j)\cdot f_{i-1,j-1} \]

直接 DP 即可. 时间复杂度 \(\Theta(nk)\) .

\(\textbf{Subtask 4: 51 pts}\)

\(\textbf{WHATTTTT? }1\leq n\leq 10^6 \textbf{ ?}\)

事实上,有一种 \(\Theta(n\log n)\) 的做法,只是你想不到.

其实这个问题可以等价于:有一组随机均匀实数序列 \(a_{1\ldots n}\in [0,1]\) ,求 \(\sum\limits_{i=1}^{n-1}[a_i>a_{i+1}]<k\) 的概率减去 \(\sum\limits_{i=1}^{n-1}[a_i>a_{i+1}]<k-1\) 的概率之差乘上 \(n!\) 的值.

有的人可能就会问了,这跟排列有什么关系呢?排列中的数互不相同,但是 \(a\) 序列中可能出现 \(a_x=a_y\) 的情况呀!

实际上,由于 \(a_i\)\([0,1]\) 中的随机均匀实数,且 \([0,1]\) 中的实数个数是无穷的,正好选中同一个实数的概率趋近于 \(0\) ,所以我们不用担心这个问题.

可转换成这个问题又怎样呢?我们还是不会求啊!或者说,我们可以将上述式子转化为求和的形式吗?

其实,这个问题就等价于 \(\sum\limits_{i=1}^{n}d_i\leq x\) 的概率. 我们可以想象一个长度为 \(1\) 的圆, 起点为 \(0\) ,终点为 \(1\)\(0\)\(1\) 重合,其之间分布着 \([0,1]\) 的均匀实数. \(a\) 序列中的数字的位置映射在上面,我们要按 \(0\to a_1 \to a_2 \to \cdots \to a_n\) 的顺序走到每个点,但只能朝顺时针方向走. 令 \(a_0=0\) ,则第 \(i\) 次走的长度为 \(d_i=a_i-a_{i-1}+[a_{i-1}>a_i]\cdot 1\) . 又由于 \(a_i,d_i\in [0,1]\) ,所以排列合法当且仅当 \(\sum\limits_{i=1}^{n}d_i=\sum\limits_{i=1}^{n}[a_{i-1}>a_i]+(a_n-a_0)\leq (x-1)+1=x\) .

于是,问题变成:有随机均匀实数序列 \(d_{1\ldots n}\in [0,1]\) ,求 \(\sum\limits_{i=1}^{n}d_i\leq x\) 的概率.

事实上,我们可以将其映射成 \([1,V]\) 中的均匀正整数,其中 \(V\to +\infty\) ,我们即求 \(\sum d_i\leq Vx\) 的概率.

则其概率为

\[f(V)=\frac{1}{V^n}\sum_{i=0}^{x-1}(-1)^i\dbinom{n}{i}g(V(x-i),n+1) \]

上述式子运用了容斥原理,即,钦定 \(0\) 个不满足条件(不在 \([1,V]\) 中)的方案数,减去钦定 \(1\) 个不满足条件(不在 \([1,V]\) 中)的方案数,加上钦定 \(2\) 个不满足条件(不在 \([1,V]\) 中)的方案数……

至于为什么 \(Vx\) 要减去 \(Vi\) ,其实这就是钦定 \(i\) 个不满足条件(将这 \(i\) 个数每个加上 \(V\) ,定使得这 \(i\) 个数大于 \(V\)).

其中,\(g(i,j)\) 表示将正整数 \(i\) 分为 \(j-1\) 个有序的正整数和 \(1\) 个自然数的方案数,即满足关于 \(x\) 的整数方程 \(\sum\limits_{q=1}^{j} x_q=i,x_j\geq 0,\forall 1\leq i < j,x_i\geq 1\) 的解的个数,利用插板法可得其方案数为 \(\dbinom{i}{j-1}\) .

则原式变为

\[\begin{aligned} f(V)&=\frac{1}{V^n}\sum_{i=0}^{x-1}(-1)^i\dbinom{n}{i}\dbinom{V(x-i)}{n} \\ &=\frac{1}{V^n}\sum_{i=0}^{x-1}(-1)^i\dbinom{n}{i}\frac{(V(x-i))^\underline{n}}{n!} \end{aligned} \]

其中,\((x)^\underline{n}=x(x-1)(x-2)\cdots(x-n+1)\) . 由于当 \(V\to +\infty\) 时,\(V(x-i)-k\) 中的常数 \(-k\) 没有意义,所以

\[\begin{aligned} f(V)&=\frac{1}{V^n}\sum_{i=0}^{x-1}(-1)^i\dbinom{n}{i}\frac{(V(x-i))^n}{n!} \\ &=\frac{1}{n!}\sum_{i=0}^{x-1}(-1)^i\dbinom{n}{i}(x-i)^n \end{aligned} \]

于是,所求答案即为 \(n!(f(k)-f(k-1))\) ,时间复杂度为 \(\Theta(k\log n)\) .

posted @ 2023-03-14 14:15  December456  阅读(34)  评论(0)    收藏  举报