计数记录

为什么我要做计数来着?

叁仟柒佰万 $ _{5.4}$

求分割一个序列使得每段 \(\text{mex}\) 值相等的方案数对 \(10^9+7\) 取模。

\(n\le 3.7\times 10^7\)

View solution

发现重要结论:最终每一段的 \(\text{mex}\) 应该和整个序列的 \(\text{mex}\) 相同。

有了这个结论之后随便做就行了。具体的,拿双指针扫出每个 \(r\) 最靠右的合法左端点 \(l_r\),并前缀和优化 DP 就是 \(O(n)\) 的。

AGC030D Inversion Sum $ _{5.7}$

有一个长度为 \(n\) 的序列,现在有 \(q\) 次操作,每次操作都可以交换两个数的位置,对于每次操作可以选择执行或不执行。对于所有的情况求出的逆序对数量之和的和。

\(1\le n,q\le 3000,1\le a_i\le 10^9\)

View solution

考虑计数转概率,然后对于每一对 \(i,j\)\(a_i<a_j\)\(i<j\) 的关系被反转的概率,设为 \(f_{i,j}\)

假设现在的操作是 \(x,y\),那么你会修改 \(f_{x,c},f_{y,c},f_{c,x},f_{c,y}\)。拿 \(f_{x,c}\) 举例,其有 \(1/2\) 的概率变成 \(f_{x,c}\)\(1/2\) 变成 \(f_{y,c}\)

直接转移每轮复杂度 \(O(n)\),总复杂度 \(O(nq)\)

[CodeFestival16 Final F] Road of the King $ _{6.0}$

有一个 \(n\) 个点的图,目前一条边都没有。

有一个人在 \(1\) 号点要进行 \(m\) 次移动,终点不必是 \(1\) 号点,假设第 \(i\) 次从 \(u\) 移动到 \(v\),那么在 \(u\)\(v\) 之间连一条有向边。

问有多少种序列能满足:最终 \(n\) 个点组成的图是一个强连通图。答案对 \(10^9+7\) 取模。\(1 \leq n,m \leq 300\)

View solution

发现对于任意时刻,都有:

  • 若将每条边都改为双向边,那么只会有一个大小 \(\ge 1\) 的连通块,且一定包含 \(1\)
  • \(1\) 号点以外所有点本质相同。

于是,设 \(f_{i,j,k}\) 为走了 \(i\) 步,连通块大小为 \(j\)\(1\) 所在的 SCC 大小为 \(k\)

考虑填表转移,转移分 \(3\) 种:

\[\begin{cases} f_{i+1,j+1,k}=f_{i,j,k}*(n-j)\\ f_{i+1,j,k}=f_{i,j,k}*(j-k)\\ f_{i+1,j,j}=f_{i,j,k}*k \end{cases} \]

结果即为 \(f_{m,n,n}\),复杂度 \(O(n^2m)\)

P9823 The Journey of Geor Autumn $ _{6.0}$

给定 \(k\),我们规定满足以下性质的 \(1\sim n\) 的排列为“好排列”:

\(\forall k<i \le n,~a_i > \min\{a_{i-k},a_{i-k+1},...,a_{i-1}\}\)

求好排列的个数。对 \(998244353\) 取模。\(1\le n,k\le 10^7\)

View solution

先确定最小值 \(1\) 的位置,发现必须放在 \(1\sim k\) 之间,位置设为 \(p_1\)。再考虑 \(2\),发现,必须放在 \(p_1+1\sim p_1+k\) 之间,相当于一个 \(n-p_1\) 大小的子问题。

于是根据以上观察,有 \(f_n=\sum\limits_{x=1}^k \binom{n-1}{x-1} (x-1)! f_{n-x}\)

发现还是不好优化,考虑把组合数拆开,以获得 \(f_n = (n - 1)!\displaystyle\sum\limits_{x = 1}^{k}\dfrac{f_{n - x}}{(n - x)!}\)。前缀和优化后 \(O(n)\) 转移即可。

P3343 地震后的幻想乡 $ _{6.7}$

给定 \(n,m\),求对于一个 \(n\) 个点,\(m\) 条边的无向图,若其边权在 \([0,1]\) 中的实数里均匀随机,其最小生成树边权和的期望。

\(1\le n\le 10\)

View solution

\(p(x)\) 为图首次联通时间为 \(x\) 的概率分布,那么所求即为 \(\int_0^1 xp(x)\text{d}x\)。根据经典结论,上式可被转化为 \(\int_0^1 p(\ge x)\text{d}x\)。将边权看作加入这条边的时间,我们考虑对于一个时间 \(t\),求其在该时间仍不联通的概率。

我们给每条边赋予 \(0/1\) 的权值表示他是否小于等于 \(t\),如果为 \(1\) 那么小于等于 \(t\),不妨假设有 \(a\)\(1\) 边和 \((m-a)\)\(0\) 边,此时概率角度的贡献为:

\[x^a(1-x)^{m-a} \]

对于某个具体的 \(a\),我们相当于计算:

\[\int_0^1 x^a(1-x)^{m-a}=\frac{a!(m-a)!}{(m+1)!} \]

于是我们成功的再次通过分部积分将此问题转换为给边染色,恰好染 \(a\) 条黑色边使得这张图联通的方案数。

等价于求这张图的恰好 \(a\) 条边的联通子图的数量。

经典的容斥手段是对于子集 \(S\) 先任意保留边,在枚举 \(1\) 号点所在的连通块,这里我们还需要枚举 \(1\) 所在的连通块所保留的边数,此时外部的边数是固定的,然后转移,复杂度为 \(\mathcal O(3^n\cdot m^2)\)

CF1874F Jellyfish and OEIS $ _{7.2}$

计算有多少个 \([1, 2, \dots, n]\) 的排列 \(p\) 满足:对于所有满足 \(l \leq r \leq m_l\) 的区间 \((l, r)\),子数组 \([p_l, p_{l+1}, \dots, p_r]\) 不是 \([l, l+1, \dots, r]\) 的一个排列。对 \(10^9+7\) 取模。

\(1\le n\le 200\)

P11658 波特检测 $ _{6.5}$

有一个序列 \(a,a_i\in[0,2^k)\),其中 \(a_i\) 在值域内随机取值。你需要给出一个 01 序列 \(H\),满足不存在 \(i\neq j,a_i\oplus a_{i-1}=A_j\oplus A_{j-1},H_{i}=H_{i-1}=H_j=H_{j-1}=0\),求任意给出一个 \(H\) 合法的概率。

\(1\le n\le 10^6,0\le k\le 10^9\)

View solution

首先可以发现如果对序列做一次差分没有任何影响,于是将条件改成 \(A_i=A_j\),所以如果 \(H\) 中有连续的 0 就需要满足 \(A\) 不同,否则就随便填,我们可以设 \(f_i\) 表示序列中有 \(i\) 个连续两个 0 的方案数,于是答案就为:

\[\sum_{i=0}^{n-1}f_i\left(2^k\right)^{\underline{i}}\left(2^k\right)^{n-i} \]

考虑 dp 求 \(f_i\)。设 \(g_{i,j,0/1}\) 表示填了前 \(i\) 个位置,有 \(j\) 个连续的 0 且第 \(i\) 个位置填 0/1 的方案数。简单 dp 有:

\[\begin{aligned} g_{i,j,0}&=g_{i-1,j-1,0}+g_{i-1,j,1}\\ g_{i,j,1}&=g_{i-1,j,0}+g_{i-1,j,1} \end{aligned} \]

但是这样是 \(O(n^2)\) 的,然后这里有一个 trick:看到数对相乘就往向量和矩阵上面想。于是考虑生成函数,设 \(G_{i,0/1}=\sum\limits_jg_{i,j,0/1}x^j\),然后把转移写成矩阵形式:

\[\begin{bmatrix} G_{i,0}\\G_{i,1} \end{bmatrix} = \begin{bmatrix} x&1\\1&1 \end{bmatrix} ^{n-1} \begin{bmatrix} 1\\1 \end{bmatrix} \]

这个时候直接 NTT 套矩阵快速幂是 \(O(n\log^2n)\),显然爆炸,于是考虑优化。因为是生成函数,所以我们不关心 \(x\) 的取值。若我们通过 \(O(n)\) 次矩阵快速幂求出若干点值然后再 \(O(n\log n)\) 快速插值就可以保证复杂度。\(x\) 的选取和 NTT 原理相同,我们直接取单位根即可。

P12061 喜爱之钥 $ _{6.3}$

\(k\) 个人进行游戏,初始局面有 \(n\) 把锁以及只能打开对应锁的 \(n\) 把钥匙,此外还有 \(m\) 把无法打开任何锁的假钥匙,所有 \(n+m\) 把无法分辨的钥匙被均匀随机地打乱。

现在 \(k\) 人轮流进行操作,每一人可选择一把钥匙与一把锁进行尝试,在场所有人均可知道尝试结果。每一把锁只能打开一次,当所有锁均被打开后游戏结束。

每人的操作策略均为选取最大概率可开锁的组合。若有多组组合均有最大概率,则均匀随机地采用一种。

问游戏过程中,每个人打开的锁的数量的期望,对 \(10^9+7\) 取模。

\(n\le 5000\)\(m,k\le 50\)

View solution

首先第一个人的决策是完全随机的。假设其选择 \((x,y)\)。发现第二个人决策的两维中必定有一个是 \(x\)\(y\),因为这样概率最大且二者相等,所以第二个人会在 \((x,a)\)\((y,b)\) 中选一个决策。

继续观察,发现第三个人及以后的一定会作和第二个人一样的决策,直到开了一个锁或者钥匙被证明没用为止。

基于以上观察,设计 \(f_{i,j,k}\) 为有 \(i\) 个锁,\(i+j\) 个钥匙,现在轮到第 \(k\) 号人的状态的期望。前缀和优化一下,复杂度 \(O(nmk)\)

P12059 I'm Here $ _{6.7}$

给定一棵 \(n\) 个点的树。保证存在一种 dfs 序为 \(1\dots n\)。对每个 \(k\in [1,n]\),求满足如下性质的长度为 \(k\) 的数列 \(p\) 的个数:

  • \(p\in [1,n]\) 且互不相同。
  • \(i<j\)\(p_i\) 不为 \(p_j\) 的祖先。
  • \(p_i\le n-i+1\)

\(1\le n\le 80\)

View solution

发现没有最后一个限制就好做了,可以树上背包,考虑想办法简化这个限制。观察不好做的本质,发现是因为树上背包的插入顺序只允许题目有相对限制。发现若一个排列不满足条件,那么一定有至少一个后缀 \(\max\) 不满足条件。结合题目保证 \(1\sim n\) 为 dfn 序,考虑把插入顺序改为 \(n\rightarrow 1\)

转移设 \(f_{i,j,k}\) 为填入了 \(i\sim n\),选择了 \(j\) 个数,且最后一个元素为 \(k\) 的方案数。

分类讨论:

  • \(i\) 没被选中,继承 \(f_{i+1}\) 的状态即可。
  • \(i\) 被选中,且为后缀最大值,\(i\) 填在当前序列末尾,枚举一个位置 \(x\),满足 \(k<x\le n-i+1\),从 \(f_{i+1}\) 转移过来。显然满足限制 2。
  • \(i\) 被选中,且不为后缀最大值,枚举子树内包括 \(i\) 共选了 \(x\) 个数,那么这 \(x\) 个数填在 \(k\) 前面即可。有 \(f_{i,j+x,k}\leftarrow f_{i+sz_i,j,k}\times g_{i,x}\times \binom{k-j}{x}\)

复杂度 \(O(n^4)\)

CF1657E Star MST $ _{5.4}$

假设有一个 n 个点的无向连通图,每条边的边权均在 [1,k] 之间。 满足其 最小生成树的边权和 和 与节点 1 相连的边的权值和 相等,求方案数。

\(1\le n,k\le 250\)

View solution

显然,题意等价于对于所有的边 \((x,y)\)\(w_{x,y}\ge \max(w_{1,x},w_{1,y})\)

\(f_{i,j}\) 表示已经在图中加入了 i 个点,这些点到 1 号点的距离最大值为 j 时,有多少种不同的构图方案。随便 DP 一下即可,复杂度 \(O(n^3\log n)\)\(\log\) 在快速幂上。

P3349* [ZJOI2016] 小星星 $ _{6.5}$

给定一个 \(n\) 个点,\(m\) 条边的无向图 \(G\) 和一棵 \(n\) 个点的树 \(T\),求有多少个长度为 \(n\) 的排列 \(p\),使得 \(∀\forall(u,v)\in T,(p_u,p_v)\in G\)

\(1\le n\le 17\)

View solution

首先,有较为显然的状压 DP:\(f_{i,k,p}\) 表示树上的 \(i\) 对应图上的 \(k\) 且树上 \(i\) 的子树对应图上状压集合 \(p\)

其复杂度瓶颈为枚举子集,复杂度 \(O(3^nn^3)\),无法通过。

考虑去掉状压,此时会有重复,故考虑使用子集反演。

\(F(S)\) 为只考虑图中 \(S\) 部分的点,\(G(S)\) 表示 \(S\) 中的点不重不漏出现的方案数,那么有

\[G(S)=\sum_{T \subset S}G(T)[S=T] \]

由非空集合的奇子集和偶子集个数相等(空集只有一个偶子集)可知:

\[\sum_{T \subset S}(-1)^{|T|}=[S=\varnothing] \]

将其代入前述式子:

\[G(S)=\sum_{T \subset S}G(T)\sum_{R \subset S \setminus T}(-1)^{|R|} \]

交换求和符号并代入 \(F\) 的定义式:

\[G(S)=\sum_{R \subset S }(-1)^{|R|}\sum_{T \subset S \setminus R}G(T)=\sum_{R \subset S }(-1)^{|R|}F(S \setminus R) \]

换元,即:

\[G(S)=\sum_{T \subset S}(-1)^{|S|-|T|}F(T) \]

以上,求出单个 \(F\) 的时间复杂度减至 \(O(n^3)\),且由 \(F\)\(G\) 的过程是一个高维前缀和,故瓶颈在于计算每个 \(F\),总时间复杂度即 \(O(2^n n^3)\),可以通过。

P13969 Exchange and Deletion $ _{6.3}$

使用 eps 分钟做出紫题,已严肃无敌!

给定一个长度为 \(n\) 的数组 \(a\),初始时 \(a_i=i\)。还给定一个长度为 \(k\) 的数组 \(b\),其中元素是 \(1\)\(n\) 的两两不同的数。

进行 \(k\) 步操作,在第 \(j\) 步时,选择一个下标 \(i\),满足 \(1 \leq i \leq n-j+1\)\(a_i = b_j\),然后交换 \(a_i\)\(a_{n-j+1}\)。接着删除当前数组的最后一个元素。

计数有多少个长度为 \(k\)\(b\) 使得每步操作时 \(b_x\) 都还在 \(a\) 中出现,且在 \(k\) 步操作后,\(a\) 严格递增。

\(1\le k\le n\le 5\times 10^5\)

View solution

考虑把 swap 改成连边 \(y\rightarrow x\ (x<y)\),过程类似于每个点会往前跳,形成若干条链,最后只保留跳到前 \(n-k\) 个位置的点。

那么最后连到 \(n−k\) 前的点的数值等于链头,而 \(n−k\) 后的点和链上非链头的点实际上都被删了。

为了保证递增,可以发现合法从后面来的点在最终 \(a\) 中一定是一个递增的后缀。枚举 \(i\) 表示链尾成功到达 \([1,n−k]\) 的链个数。故,答案为:

\[\sum_{i=0}^{min(k,n-k)} \binom kik^{^{\underline{k-i}}} \]

其含义为从后面 \(k\) 个点选择 \(i\) 个点越过 \(n-k\) 点,后面 \(k-i\) 个点肯定在 \([n-k+1,n]\) 内随便找个点向前连,同时注意我们不能钦定多于 \(n-k\) 个点到 \([1,n-k]\)。复杂度 \(O(k)\)

CF1580B Mathematics Curriculum $ _{6.0}$

我们定义一个排列中的数字 \(x\) 是好的,当且仅当包含它的子串的最大值去重后的个数为 \(m\)

计数有多少长度为 \(n\) 的排列满足好的数字有恰好 \(k\) 个。

\(1\le n\le 70\)

View solution

设一个数位置为 \(x\),先把包含它的子串的最大值去重后的个数转化为 \([1,x)\) 的后缀 \(\max\) 数量和 \((x,n]\) 的前缀 \(\max\) 数量之和。

有结论:以上所求的东西是这个点在排列的笛卡尔树上的深度。

故问题转化为求有多少笛卡尔数满足有 \(k\) 个深度为 \(m\) 的节点。

\(f_{i,j,k}\) 为有 \(j\) 个深度为 \(k\) 的节点数量为 \(i\) 的数。转移枚举笛卡尔树最大值位置。复杂度 \(O(n^5)\)

P4778 Counting Swaps $ _{6.0}$

给定一个长度为 \(n\) 的排列 \(p\)。在每一步中,你可以选择两个数字 \(x < y\) 并交换 \(p_x\)\(p_y\)

计算最少需要用 \(m\) 次交换才能将其排序的排列数量,对 \(10^9 + 9\) 取模。

\(1\le n\le 10^5\)

View solution

首先把 \(i\)\(a_i\) 连边,这就转化成了一个图,可以发现这个图是由若干个环(可能包括自环)组成的。

排序后的序列转化成的图是由 \(n\) 个自环组成的,我们可以发现每次操作,如果两点在一个环内,就多一个环;否则,就少一个环。如果我们现在有 \(k\) 个环,那至少操作 \(n-k\) 次。

对于每个环单独考虑,我们可以把分裂环的操作倒过来地看成合并操作,这样就有了树的结构,仔细分析,我们要求的是有标号无根树的数量,就是 \(l^{l-2}\)

然后考虑所有的环,进行集合排列,答案就是 \(\prod {\frac{l^{l-2}}{(l-1)!}} \ \times (n-k)!\),其中 \(l\) 是各个环的大小。

ABC236Ex Distinct Multiples $ _{6.3}$

ARC107D Number of Multisets $ _{6.0}$

CF724F Uniformly Branched Trees $ _{6.0}$

posted @ 2025-10-20 18:20  HgSO4qwq  阅读(21)  评论(0)    收藏  举报