暑期德国鸡腿堡

07/01/2025

置换

直接做很困难,考虑枚举环长计算方案数。对于环长 \(d\),先选出来 \(d\) 个,环内排列的方案数为 \((d-1)!\)(最开始一个点 \(1\) 中方案,每新加一个点就插入进之前的环里),环外随便排列是 \((n-d)!\),再算上期望,答案是:

\[\frac{\sum\limits_{i=1}^{n} \binom{n}{i} (i-1)! (n-i)! i^k}{n!} = \sum\limits_{i=1}^{n} \frac{\frac{n!}{i! (n-i)!} (i-1)! (n-i)! i^k}{n!} = \sum\limits_{i=1}^{n} i^{k-1} \]

然后直接拉插。对于前 \(n\) 个数的幂次,由于是完全积性函数,欧筛即可。

求和

就是求:

\[\sum\limits_{i=0}^{\frac{n}{k} - 1} \binom{ik + r}{x} \]

\(r = 0\) 时还要加上 \(\binom{n}{x}\)

直接暴力的时间复杂度是 \(O(q \times \frac{n}{k})\) 的,那么显然在 \(k > \sqrt{q}\) 的时候时间复杂度是 \(O(n \sqrt{q})\) 的,直接能过。那么现在的问题就是当 \(k \leq \sqrt{q}\) 时怎么求解。

我们发现这个式子无法化简,难以直接求出,也没有什么特别好的性质。但是我们发现当 \(k \leq \sqrt{q}\) 时,本质不同的询问数量不超过 \(n \sqrt{q}\),所以我们考虑寻找这些本质不同询问之间的关系。

我们设 \(f(x,r) = \sum\limits_{i=0}^{\frac{n}{k} - 1} \binom{ik + r}{x}\)。由组合恒等式,得:

\[f(x,r) = \sum\limits_{i=0}^{\frac{n}{k} - 1} \binom{ik + r - 1}{x} + \binom{ik + r - 1}{x-1} = f(x,r-1) + f(x-1,r-1) \]

由此我们得到了一个递推式。但是有一个问题就是当 \(r = 0\) 时,由于 \(r\) 为余数,\(r - 1\) 会再次回到 \(k-1\),这就出现了一个环,不能直接递推,所以我们要把 \(r = 0\) 当做边界来处理。但是暴力计算时间复杂度是 \(O(n^2)\) 的,所以我们要考虑其他方法。我们观察到:

\[\binom{n}{x} + \sum\limits_{i=0}^{k-1} f(x,i) = \sum\limits_{i=1}^{n} \binom{i}{x} = \binom{n+1}{x+1} \]

所以这时候我们可以考虑从小到大枚举 \(x\)(边界为 \(x = 0\)),然后将每个 \(x\)\(f(x,0)\) 设为未知数 \(a\),然后把 \(a\) 带着递推,最后解个方程就行了。这样最坏的时间复杂度就是 \(O(n \sqrt{q})\) 的。

BST

先考虑树形态固定时怎么把树快速建出来。其实很简单:每新加一个点,它只有可能连接到它当前的前驱或后继上,具体连哪个取决于哪个点后加入。

由此我们得到一条重要性质:\(a_1,a_2,\cdots,a_r\)\(a_{r+1},a_{r+2},\cdots,a_n\) 分成了很多值域连续段,其中每个连续段自成一棵子树,内部形态与外界无关。

这不难证明,如下图:

圆点是 \([1,r]\) 中的点,方点是 \([r+1,n]\) 中的点,红色方点是当前连续段中第一个被加入的。可以注意到只有红色方点会连向圆点,剩下的方点由于先前方点的存在也会连到方点上,所以方点自成一棵子树,且由于 \([r+1,n]\) 加入顺序确定,其形态也固定。

现在再来考虑 \([1,r]\) 中形态有变的问题。\([r+1,n]\) 中的点现在只作为一些子树来加权。而 \([1,l-1]\) 中的点形态也是固定的,所以真正有影响的就只有 \([l,r]\) 中的点。将所有点(三角形是 \([1,l-1]\) 中的点,圆点是 \([l,r]\) 中的点,下面的大三角是 \([r+1,n]\) 形成的子树)放在值域上考虑:

边界上的子树会直接归属于其相邻节点;而如果一棵子树在三角和圆点之间,那么由于圆点加入时间更晚,所以会连向圆点。只有当子树在圆点之间时,子树连向的点才不固定。问题转化为对于每一段在三角之间的圆点和子树,求方案使得深度之和最小,转化一下即每棵子树 \(size\) 之和最小。由于圆点数量 \(\leq 5 \times 10^3\),所以可以考虑 DP。设 \(f_{l,r}\) 表示将 \([l,r]\) 中圆点顺序确定后 \(size\) 和的最小值(其中 \([l,r]\) 管辖的子树包含区间内的和 \([l-1,l]\)\([r,r+1]\) 之间的)。每次转移就去枚举当前子树的根(最先被加入的的点),那么状态转移就是:

\[f_{i,j} = \min\limits_{k=i}^{j} f_{i,k-1} + f_{k+1,j} \]

其中空区间 \(f\) 值为 \(0\)。这样我们就可以在 \(O((r-l+1)^3)\) 的时间内解决问题。可以观察到此 \(f\) 满足四边形不等式,所以可以使用相关技巧进一步优化至 \(O((r-l+1)^2)\),可以通过。

最小最大

直接做显然不好做。考虑先枚举 \(\min\)\(\max\),然后计算其贡献。这个连通块大小可以转化为枚举点 \(x\),如果 \(x\) 在块内那么权值就加上 \(\min \times \max\)。考虑什么情况下三元组 \((\min,\max,x)\) 合法:这三点两两之间的路径上的最小值都 \(\geq \min\),最大值都 \(\leq \max\)

由于涉及路径问题。可以考虑使用点分治。对于分治中心 \(y\),设 \(mn(u)\) 表示 \(u\)\(y\) 路径上的编号最小值,\(mx(u)\) 表示 \(u\)\(y\) 路径上的编号最大值,那么三元组 \((\min,\max,x)\) 要满足的条件即为:

  • \(mn(\min) = \min,mx(\min) \leq \max\)
  • \(mn(\max) \geq \min,mx(\max) = \max\)
  • \(\min \leq mn(x),mx(x) \leq \max\)

我们考虑从大到小枚举 \(\min\),那么当 \(\min\) 逐渐减小时,\(\max,x\) 的限制都逐渐放宽,可以考虑使用双指针添加满足 \(mn \geq min\)\(\max\)\(x\)。对于剩下的 \(\max\) 条件,可以使用线段树维护:当加入一个 \(\max\) 时,把它在线段树上标记为可选,权值设为 \(\max\);当加入一个 \(x\) 时,\(\geq mx(x)\)\(\max\) 多了一个可选的 \(x\),那就在线段树上给后缀加一个其自己对应的下标(未被标记的加 \(0\))。对于最后一个限制 \(mx(\min) \leq \max\) 的限制,相当于就是一个后缀求和。线段树上维护的信息形如 \(A \times B\),容易维护。最终时间复杂度就是 \(O(n \log^2 n)\)

07/03/2025

Count Set

转化一下就是有很多置换环,要求在图上选 \(k\) 个点,满足这些点在环上不相邻。显然不同的环之间没有什么关系,所以可以考虑求出每个环的答案后再合并起来。

对于一个环长为 \(d\) 的环,在其中选 \(i\) 个不相邻的点的方案数容易得到:

\[\binom{d-i-1}{i-1} + \binom{d-i}{i} \]

那么最终我们可以将每个环的生成函数卷起来,然后直接输出即可。这个东西虽然每个多项式最高次可能不是 \(1\),但是环之间乘出来的最高次就是 \(n\)。我们可以使用分治 NTT 解决,因为分治树高为 \(O(\log n)\),所以每个多项式最多被算 \(O(\log n)\) 次,总复杂度就是 \(O(n \log^2 n)\)。也可以使用堆进行合并果子,时间复杂度也是 \(O(n \log^2 n)\)

Shattrath City

正难则反,考虑计算不合法的方案数。设 \(f_i\) 表示前 \(i\) 个数已经选好,且第一个不合法的排列在 \(i\) 处结束。那么转移是很显然的:

\[f_i = n! \times n^{i-n} - \sum\limits_{j=1}^{i-1} f_j \times n^{\max(i-n-j,0)} \times \min(n,i-j)! \]

可以发现这是个半在线卷积,可以用分治 NTT 做到 \(O(n \log^2 n)\)。但是我们还可以进一步优化。

设:

\[F(x) = \sum\limits_{i=0}^{\infty} f_i x^i \]

\[S(x) = \sum\limits_{i=0}^{\infty} [i \geq n] n! n^{i-n} x^i \]

\[G(x) = \sum\limits_{i=1}^{\infty} [i < n] i! x^i \]

\[H(x) = \sum\limits_{i=1}^{\infty} [i \geq n] n! n^{i-n} x^i \]

那么:

\[F(x) = S(x) - F(x) G(x) - F(x) H(x) \]

\[(1 + G(x) + H(x)) F(x) F(x) = S(x) \]

\[F(x) = \frac{S(x)}{1 + G(x) + H(x)} \]

现在可以采用多项式求逆,时间复杂度可以做到 \(O(n \log n)\)

Gilneas

期望直接算不好算,可以考虑计算每一次操作对于答案的贡献。

对于一条边 \((u,v)|depth_u < depth_v\) 如果它最后一次是被操作 \((x_i,c_i,p_i)\) 染色为 \(c_i\)

  • \(x_i\) 要在 \(v\) 的子树中
  • \(i\) 之前的操作不影响此次染色,所以 \([1,i-1]\) 这些操作对应概率是 \(1\)
  • 对于 \(i\) 之后的操作,如果有某次操作访问到了 \(u\) 或者 \(v\),那么第 \(i\) 次染色操作无效。对于这种操作,为了让其不影响 \(i\) 号操作,需要乘上 \(1 - p_j\) 的概率。

所以可以考虑按照时间倒序枚举,每次算答案时将 \(x_i\) 到根路径上的边的概率之和求出,然后再乘上 \(c_i p_i\),修改操作就修改和 \(x_i\) 到根有连接的边。这个东西看似可以直接树剖,但是修改时如果直接改的话对于每个点都要修改其领域内的边,难以维护。

我们可以发现,如果修改时我们访问到了点 \(u\),那么所有边 \((u,v)|depth_u < depth_v\) 概率都会乘上一个值;而如果是访问到了 \(v\),那么 \(u\) 肯定也会被访问到。所以点 \(v\) 其实是没有什么用处的,我们只用看父节点对应的概率即可。这样修改时正常从 \(x_i\) 开始往上改,查询时由于概率上放到了父亲,所以要从 \(fa_{x_i}\) 开始询问。这样就可以使用树剖,时间复杂度 \(O(n \log^2 n)\)

Connectivity of Erdős-Rényi Graph

可以通过计算连通块数量为 \(i\) 的概率,再乘上 \(i\),最后求和来计算期望。

对于这种数据范围较大的一类有标号无向连通图计数 / 算概率的问题,可以考虑使用指数型生成函数求解。

有标号连通无向图满足如下式子:

\[g_n = \sum\limits_{i \geq 0} \frac{1}{i!} \sum\limits_{k_1 + \cdots + k_i = n} \binom{n}{k_1,\cdots,k_i} \prod\limits_{j=1}^{i} f_{k_j} \]

\[\frac{g_n}{n!} = \sum\limits_{i \geq 0} \frac{1}{i!} \sum\limits_{k_1 + \cdots + k_i = n} \prod\limits_{j=1}^{i} \frac{f_{k_j}}{k_j!} \]

\[\frac{g_n}{n!} = [x^n] \sum\limits_{i \geq 0} \frac{\hat{F}(x)^i}{i!} = [x^n] e^{\hat{F}(x)} \]

\[\hat{G}(x) = e^{\hat{F}(x)} \]

套用到本题上,假设我们现在已知 \(f_i\) 表示点数为 \(i\) 的无向图连通的概率,可以考虑用类似的方法求解 \(g_n\) 表示点数为 \(n\) 时的答案。考虑枚举连通块数量:

\[g_n = \sum\limits_{i \geq 1} \frac{i}{i!} \sum\limits_{k_1 + \cdots + k_i = n} \binom{n}{k_1,\cdots,k_i} \frac{(1-p)^{\binom{n}{2}}}{\prod\limits_{j=1}^{i} (1-p)^{\binom{k_j}{2}}} \prod\limits_{j=1}^{i} f_{k_j} \]

组合数后面的系数意义为这 \(i\) 个连通块两两之间没有边相连。直接算出连通块之间的边数比较复杂,可以考虑用总共有的边数,减去每个连通块内的所有边数(块内已确定),即为:

\[\binom{n}{2} - \sum\limits_{j=1}^{i} \binom{k_j}{2} \]

然后化简之前的式子:

\[\frac{\frac{g_n}{(1-p)^{\binom{n}{2}}}}{n!} = \sum\limits_{i \geq 1} \frac{1}{(i-1)!} \sum\limits_{k_1 + \cdots + k_i = n} \prod\limits_{j=1}^{i} \frac{\frac{f_{k_j}}{(1-p)^{\binom{k_j}{2}}}}{k_j!} \]

\[\begin{aligned} \hat{G}(x) &= \sum\limits_{i \geq 1} \frac{\hat{F}(x)^i}{(i-1)!} \\ &= \hat{F}(x) \sum\limits_{i \geq 1} \frac{\hat{F}(x)^{i-1}}{(i-1)!} \\ &= \hat{F}(x) \sum\limits_{i \geq 0} \frac{\hat{F}(x)^i}{i!} \\ &= \hat{F}(x) e^{\hat{F}(x)} \end{aligned} \]

用同样的方法可以推得 \(\hat{F}(x)\)。考虑一张图所有情况的概率加起来是 \(1\),所以:

\[h_n = \sum\limits_{i \geq 0} \frac{1}{i!} \sum\limits_{k_1 + \cdots + k_i = n} \binom{n}{k_1,\cdots,k_i} \frac{(1-p)^{\binom{n}{2}}}{\prod\limits_{j=1}^{i} (1-p)^{\binom{k_j}{2}}} \prod\limits_{j=1}^{i} f_{k_j} = 1 \]

\[\frac{\frac{1}{(1-p)^{\binom{n}{2}}}}{n!} = \sum\limits_{i \geq 0} \frac{1}{i!} \sum\limits_{k_1 + \cdots + k_i = n} \prod\limits_{j=1}^{i} \frac{\frac{f_{k_j}}{(1-p)^{\binom{k_j}{2}}}}{k_j!} \]

\[\hat{H}(x) = e^{\hat{F}(x)} \]

\[\hat{F}(x) = \ln \hat{H}(x) \]

所以:

\[\hat{G}(x) = \hat{H}(x) \ln \hat{H}(x) \]

这样就可以使用多项式技巧在 \(O(n \log n)\) 的时间内求解。

posted @ 2025-07-04 10:10  gevenfeng  阅读(32)  评论(1)    收藏  举报