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\) 不改变的位置,于是有
直接 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\) 的概率.
则其概率为
上述式子运用了容斥原理,即,钦定 \(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}\) .
则原式变为
其中,\((x)^\underline{n}=x(x-1)(x-2)\cdots(x-n+1)\) . 由于当 \(V\to +\infty\) 时,\(V(x-i)-k\) 中的常数 \(-k\) 没有意义,所以
于是,所求答案即为 \(n!(f(k)-f(k-1))\) ,时间复杂度为 \(\Theta(k\log n)\) .