【WC 2026】cxy 欧拉数
- 对于序列 \(p\),设 \(asc(p)=\sum_{i=1}^{n-1} [p_i<p_{i+1}]\)。
- 定义欧拉数 \(\left\langle^n_k\right\rangle\) 表示有多少个 \(n\) 阶排列满足 \(asc(p)=k\)。
- 一种递推方式:考虑插入 \(n\),则 \(A_{n,k}=(k+1)A_{n-1,k}+(n-k)A_{n-1,k-1}\)。
QOJ5448 另一个欧拉数问题(\(O(n^2)\) 做法)
考虑每次插入最大值构造 \((n,\alpha)\) 阶排列,只能选择一个空插入所有 \(n\)。
类似上面进行递推就好。
- 另一种欧拉数递推方式:每次在末尾添加一个元素。这样我们需要记录最后一个元素的排名:\(A_{n,k,x}=A_{n-1,k-[y<x],y}\),可以前缀和优化。\(O(n^3)\)
QOJ5532 CEOI 2016 kangaroo(\(O(n^2)\))
这个题直接连续段 dp,需要记录起点终点是否被选择。
- 容斥计算欧拉数:
- 形式化描述容斥:\(w(a)=\prod_i (p_i[f_i(a)=0]+q_i[f_i(a)=1])\)。
- 我们需要求 \(\sum_{a\in A}w(a)=\sum_{a\in A}\prod_i (p_i+(q_i-p_i)[f_i(a)=1])=\sum_{S} \prod_{i\not\in S} p_i\prod_{i\in S} (q_i-p_i)\mathrm{cnt}(S)\),其中 \(cnt(S)=\sum_{a\in A} \prod_{i\in S} [f_i(a)=1]\)。
- 带入 \(p_i=1,q_i=x\):\(\sum_{S} (x-1)^{|S|}cnt(S)\),考虑求 \(cnt(S)\)。
- 等于从 \(1\sim n-1\) 中选出 \(k\) 个位置,规定他们是 \(<\)。
- \(\left\langle^n_m\right\rangle=\sum_{i=0}^{n-m} i^n \binom{n+1}{m+i+1}(-1)^{n-i+m}\)。
- \(\left\langle^n_m\right\rangle=[\frac{x^n}{n!}y^m]\sum_{k\ge 0} (x-1)^k (e^y-1)^{n-k}=\sum_{k=0}^{m}(k+1)^n \binom{n+1}{m-k}(-1)^{m-k}\)。
- 可以 \(O(n\log n)\) 求一行。
LOJ575 「LibreOJ NOI Round #2」不等关系
\(s_i=[p_i<p_{i+1}]\)。
考虑形式化描述容斥:\(f_{i}(a)=[a_i<a_{i+1}],p_i=[s_i=0],q_i=[s_i=1]\)。
\(\sum_{S} (\prod_{i\not\in S} p_i)(\prod_{i\in S} (q_i-p_i))\mathrm{cnt}(S)=\sum_{S} (\prod_{i\not\in S} [s_i=0])(\prod_{i\in S} (-1)^{[s_i=0]})\mathrm{cnt}(S)\)。
考虑 \(\mathrm{cnt}(S)\),相当于有若干个连续段,段内有序,所以是多重排列。
枚举上一个 1 在哪里:\(f_i=\sum_{1\le j\le i}f_{j-1}\frac{(-1)^{c_i-c_{j}}}{(j-i+1)!}[s_j=0]\)。
QOJ9651 又一个欧拉数问题
考虑上面一题中规定了 \(s\),那么若没有做限定,我们就对每个位置确定一个 \((s_i,t_i)\) 二元组,其中 \(s_i\le t_i\)。容斥系数是 \(\prod (-1)^{s_i+t_i}\),另外还要乘上 \(t_i\) 作为多重排列的方案数。以及 \(s_i\) 对应的二进制位权值。
考虑唯一构造每种二元组序列,先加入 \(k\times (t_i=1)\),然后一直加 \((t_i=0)+k\times (t_i=1)\),每个 \(k\) 都是指可以任取的非负整数。对于 \(t_i=1\) 的位置 \(s_i\) 可以任意选。
设 \(cof_{c,S,T}\) 表示 \(s\) 结尾已经有 \(\ge k-2\) 个数,二进制表示为 \(S\),现在加入 \((t_i=0)+c\times (t_i=1)\) 后得到 \(T\),的权值。可以做到 \(O(4^kn)\) 计算。
那么一个段的转移可以描述为矩阵:\(A_{S,T}=\sum_{i=0} x^{c+1}cof_{c,S,T}\)。
考虑构造出长度为 \(len\ge k-2\) 的段后我们就可以接上矩阵部分,也就是 \(\sum_{T} [x^{n-len-1}](\sum_{p\ge 0} A^p)_{S,T}\)。
重点在于 \(\frac{1}{I-A}\),考虑 \(\mathtt{FWT}(I-A)\mathtt{FWT}(B)=\mathtt{FWT}(I)\),那么可以先 FWT 一下,求 \(n\) 次矩阵逆再 IFWT 回去,这部分复杂度 \(O(8^kn+4^k\log n)\)。\(\color{red}\mathtt !\):原 pdf 使用了牛顿迭代,并不确定是否等价。
初始没有超过 \(k-2\) 个字符可以 \(O(4^kn)\) 计算。
AT_abc267_g [ABC267G] Increasing K Times
将所有相同的 \(a_i\) 视作等价的,最后乘上阶乘即可。
考虑第一种计算欧拉数单点的方式,其中 \(i^n\) 的意义是将所有数划分到 \(i\) 个上升连续段中,那么这里若值 \(x\) 出现了 \(occ_x\) 次则方案数是 \(\prod_x \binom{i}{occ_x}\),替换 \(i^n\) 即可得到本题式子。
由于 \(occ_x\) 至多有 \(O(\sqrt n)\) 种,那么可以做到 \(O(n\sqrt n \log n)\),不过复杂度其实是 \(O(n\sqrt n)\) 的。
P11426 [清华集训 2024] 比赛
规定一下计分函数 \(s(x,y)\):
- \(\mathrm{team}_x=\mathrm{team}_y\):\(s(x,y)=0\)。
- \(x<y,\mathrm{team}_x=\color{blue}\mathtt B\):\(s(x,y)=0\)。
- \(x>y\):\(s(x,y)=(-1)^{\mathrm{team}_x}\)。
- \(\mathrm{otherwise}\):\(s(x,y)=(-1)^{\mathrm{team}_y}\)。
- 规定 \(\mathrm{team}={\color{red}\mathtt R}\) 的时候为 0,\(\mathrm{team}=\color{blue}\mathtt B\) 的时候为 1。
设 \(s'(x,y)=\begin{cases}(-1)^{\mathrm{team}_x} & \mathrm{team}_x\ne \mathrm{team}_y\\0 & \mathrm{team}_x=\mathrm{team}_y \end{cases}\)
容易发现这样总分为 0。考虑差值:
- \(x<y,\mathrm{team}_x={\color{blue}\mathtt B},\mathrm{team}_y={\color{red}\mathtt R}\):\(s'=-1,s=0\),差为 1。
- \(x<y,\mathrm{team}_x={\color{red}\mathtt R},\mathrm{team}_y={\color{blue}\mathtt B}\):\(s'=1,s=-1\),差为 -2。
那么设 \(f_i(a)\) 表示,\(i\) 号选手的前一位是否比 \(i\) 小,且要求前一位和 \(i\) 颜色不同。
- \(\mathrm{team}_i=\color{red}\mathtt R\):\(p_i=1,q_i=x\)。
- \(\mathrm{team}_i=\color{blue}\mathtt B\):\(p_i=1,q_i=x^{-2}\)。
考虑 \(\mathrm{cnt}(S)\),\(i\in S\) 要找到一个 \(j<i,\mathrm{team}_i\ne \mathrm{team}_j\)。这会形成若干条链,1 一定是链头,若有 \(k\) 条链则链的排列方式有 \((k-1)!\) 种。
由于链上颜色一定交替,于是两种颜色可以分开计算方案数。设 \(F_{s}\) 表示 \(S\) 中有 \(s\) 个是红队的方案数,\(G_t\) 同理。这部分是 \(O(n^2)\) 的。
答案是:\(\sum_{s,t}F_sG_t(n-1-s-t)!(x-1)^s(x^{-2}-1)^t\)。
这个式子可以分两次展开,即可 \(O(n^2\log n)\) 计算。
P10004 [集训队互测 2023] Permutation Counting 2
QOJ14023 International Olympiad in Fishing
QOJ17203 谜题 II
QOJ8956 欧拉?欧拉!
浙公网安备 33010602011771号