SS-组合记数

组合计数

Problem 0 - P4463

首先,“互不相同”这个条件十分难处理,所以考虑令 \(a\) 单调递增,最后再乘上一个 \(n!\) 的系数。

\(f_{n,k}\) 表示满足单调递增的 \(a\),且长度为 \(n\),值域为 \([1,k]\) 的乘积和。

考虑 \(a_n\) 是否取到上界 \(k\),可以得出转移式:\(f_{n,k}=f_{n,k-1}+f_{n-1,k-1}\times k\)

然而这样子转移复杂度过高,因此考虑优化。可以观察得出,\(f_{n,k}\) 肯定是一个多项式。令 \(g(n)\)\(f_{n,k}\) 的多项式的项数,则:

\[\because f_{n,k}-f_{n,k-1}=f_{n-1,k-1}\times k\\ \therefore g(n)-1=g(n-1)+1 \]

可得 \(g(n)=2n\)。因此,我们只需要找到 \(2n+1\) 个点,然后就可以拉插求出 \(f_{n,k}\)

Problem 1 - P4484

首先显然有一个计算最长上升子序列的 DP:\(dp_i=\max(\max\limits_{a_j<a_i}dp_j+1,dp_{i-1})\)

接下来可以由常见套路,从小到大插入数字。

考虑插入 \(n\) 之后的变化。由前面的 DP,我们假如在位置 \(k\) 插入 \(n\),只会使后面的 DP 值变成 \(\max(dp_{k-1}+1,dp_i)\)$。

但是,LIS 的 DP 值肯定满足差分数组在 \([0,1]\) 间,所以我们考虑状压,将差分数组转化成一个 int 值。

重新回顾前面插入 \(n\) 的过程。可以发现,我们所做的就是将差分数组第一个为 1 的数变成 0。

剩下的打表即可。

Problem 2 - ARC138E

首先,让所有满足 \(a_i\not=0\) 的点 \(i\)\(a_i-1\) 建边。这样子,我们会建出一个点为 \(0\sim n+1\) 的图,图为若干个链组成。

为了防止记重,我们对于每个链只计算一次。则最后的答案肯定形如一个 \((L_1,L_2,\cdots,L_k,R_k,\cdots,R_2,R_1)\),且满足 \(R_i>L_i\)\(R_i\)\(L_i\) 有边。

接下来,我们枚举 \(L_i\) 左边的链的大小 \(x\)\(R_i\) 右边的链的大小 \(y\),则这部分的答案为 \(\binom{n+1}{x+y}\left\{^x_k\right\}\left\{^y_k\right\}\sum\limits_{i}\left\{^{n+1-x-y}_{\ \ \ \ \ \ i}\right\}\),其中 \(\left\{^a_b\right\}\) 是第二类斯特林数。

最后对于所有 \(x,y\) 求和即可。

Problem 3 - P5400

看到”恰好“,首先往容斥想。

定义 \(f_i\) 为至少有 \(i\) 个的概率。则总答案为 \(\sum\limits_{i=k}^{\min(n,m,l)}\binom{i}{k}(-1)^{i-k}f_i\)

接下来计算 \(f_i\)。显然,对于 \(i\) 个极大的位置 \((x_i,y_i,z_i)\),满足所有 \(x_i,y_i,z_i\) 互异。而对于任意的 \((x_i,y_i,z_i)\),它的答案都是不变的,所以我们先让 \(f_i\) 乘上一个 \(A_n^i\times A_m^i\times A_l^i\) 的系数。对于第 \(j\) 个位置,它影响到的位置数量是 \(nml-(n-j)\times(m-j)\times(l-j)\) 的,且每个位置作为极大位置的概率相同,因此概率是总情况数的倒数:\(\dfrac{1}{nml-(n-j)(m-j)(l-j)}\)

最后把式子整合一下即可。

Problem 4 - AGC064D

考虑怎样的答案串可以被表示出来。设我们要检查的字符串为 \(t\),然后逆序遍历 \(s\)

  • 如果 \(s_i\)B,那么我们需要在 \(t\) 中找到任意一个满足末尾为 B 的前缀,然后把这个前缀移到前面。
  • 否则,我们在 \(t\) 需要找到任意一个以 R 开头的字符串,并将最前面的 R 删去;如果没有,则 \(t\) 不可以是最后的结果。

这个正确性是显然的,因为我们实际上就在倒序处理所有操作。

但是,这个检查的方法有许多”任意一个”,所以没办法详细的刻画一个串能否被表示。所以考虑改进上面的方法。

  • 对于第二种操作,显然取任意一个位置都是一样的。
  • 对于第一种操作,我们需要考虑后续的操作二。因为后面的操作相当于是说在删去一串 R,所以我们需要让删去后前缀 R 的总和最大即可。

接下来,就可以确定怎样的答案串可以被表示了。

  • \(s\) 翻转。
  • \(s\)\(i\)B 前出现了 \(a_i\)B
  • \(t\) 中的 B\(t\) 划分成了长度分别为 \(b_1,b_2,\cdots,b_k\) 的极长 R 串。
  • \(b_2\sim b_k\) 降序排序。
  • \(\forall t\ a_i\le \sum\limits_{i=1}^t b_i\)(需要注意的是,\(a_i\) 本身就是前缀和)。

接下来考虑 DP。我们将降序排序转化成单调不增,最后再乘上组合系数。令 \(f_{i,j,k}\) 表示最小值为 \(i\),当前选了 \(j\) 个数,和为 \(k\) 的方案数。

枚举当前选了多少个,即可转移。特别需要注意的是边界问题。

Problem 5 - CF1942G

首先,转化题目。我们将题面表示成:

  • 你有一个初始为 \(5\) 的变量 \(cnt\)\(a\) 张类型 A 的牌,\(b\) 张类型 B,\(c\) 张类型 C,\(5\) 张特殊牌。
  • 类型 A 和特殊牌会使 \(cnt\gets cnt-1\),类型 B 没有影响,类型 C 会让 \(cnt\gets cnt+1\)
  • 你持续操作,直到 \(cnt=0\) 或取完所有牌,问你停止操作后取完所有特殊牌的方案。

首先,由于类型 B 对答案没有影响,所以我们最后只需要乘上一个 \(\binom{a+b+c+5}{b}\) 的系数。然而我们最后求得是概率,所以需要除以 \(\binom{a+b+c+5}{a,b,c,5}\) 的总方案数。可以发现,B 类型对答案的贡献被抵消了,所以我们只需要算类型 A,类型 C,还有特殊牌。

特殊牌和类型 A 对 \(cnt\) 的影响是固定的,所以我们可以先把他们都归为一类,然后最后乘上 \(\binom{a+5}{5}\) 即可。

接下来,分最后是 \(cnt=0\) 还是取完所有牌两种情况来考虑。而这两种情况是类似的,因此只考虑一类。

对于 \(cnt=0\),我们枚举结束时取了多少张类型 C 的牌,设为 \(i\)。接下来,就是一个经典的格路计数问题,可以用组合计数 + 容斥。

最后,由于后面可以任意排列,所以我们再乘上 \(\binom{a+b-2i}{a-i}\) 即可。

Problem 6 - CF1874F

首先考虑容斥。我们钦定有 \(x\) 个区间满足 \([l,r]\)\(l\sim r\) 的排列,则我们要乘上 \((-1)^x\)

但是题目条件还是很难处理。所以考虑挖掘性质。我们发现,如果 \([l1,r1]\)\([l2,r2]\) 满足 \(l1\le l2\le r1\le r2\),那么 \([l2,r1],[l1,l2],[r1,r2]\) 也满足要求。

所以说,如果两个区间有交,他们可以被拆分成若干个不交区间。因此,我们计数时只需要考虑不交或包含的区间即可。

因此区间的关系类似一棵树,可以考虑 DP。令 \(f_{l,r}\) 为根节点是 \([l,r]\) 的方案数,\(g_{l,r,x}\)\([l,r]\) 区间内有 \(x\) 个位置没有覆盖的方案数。

接下来的 DP 是简单的。

Problem 7 - P8478

不会,不想补。

Problem 8 - P4931

首先,考虑 \(k\) 对和睦的情侣的数量。

总的方案是 \(\binom{n}{k}^2k!2^k\)

接下来,剩下 \(n-k\) 对情侣不能是和睦的,可以用类似错排的方法。

\(f_i\)\(i\) 对情侣不和睦的方案数。

首先,坐在最前面的两个人不能是情侣,所以有 \(2n\times(2n-2)=4n\times(n-1)\) 种方案。

然后,记 \(i\)\(p_i\) 是情侣,坐在最前面的两个人是 \(x\)\(y\),则我们分讨一下 \(p_x\)\(p_y\) 是否坐在一起。

  • 坐在一起:\(2\times(n-1)\times f_{n-2}\),其中 \(2\) 表示 \(p_x\)\(p_y\) 可以交换。
  • 不坐在一起:\(f_{n-1}\)

也就是说,\(f_i=4n\times(n-1)\times(2(n-1)\times f_{n-2}+f_{n-1})\)

最后用 \(f_{n-k}\) 乘上前面的东西即可。

Problem 9 - QOJ5357

考虑如何合并答案。设我们现在合并 \((u,v)\) 这条边。

对于这个连通块的方案,我们每次都需要选在原本 \(u\) 连通块或原本 \(v\) 连通块的点。

然而,对于不在两个分治中心的路径上的点,我们选它的方案已经被记录到原本的 DP 中了, 所以不用考虑它们。

接下来就是在分治中心路径上的点。同样的,我们选在原本 \(u\) 连通块的两个点的顺序不会影响答案。

所以说,我们合并只会乘上 \(\binom{dep_u+dep_v}{dep_u}\) 的方案数,其中 \(dep_u\) 表示 \(u\) 在原本连通块的点分树的深度。

最后 DP 即可,令 \(dp_{u,i}\) 表示节点 \(u\) 的子树内,\(i\) 。可以证明,我们如果严格限制 DP 的枚举的上界的话,那么时间复杂度就是 \(O(n^3)\) 而不是 \(O(n^2)\)

Problem 10 - P10104

不会,记得补。

Problem 11 - CF1081G

首先对于块内和块之间分别统计。

块内:

对于 \(i,j\),显然 \(a_i\)\(a_j\) 的大小关系是均等概率的,所以期望逆序对为 \(\frac{1}{2}\)

对于一个长度为 \(n\) 的块,一共有 \(\frac{n(n-1)}{2}\)\(i,j\),所以块内的期望逆序对为 \(\frac{n(n-1)}{4}\)

块与块之间:

首先,手动模拟后,我们发现:对于两个不有序的 \(a\)\(b\),我们分别以 \(a\)\(b\) 的前缀最大值划分 \(a\)\(b\),归并排序就相当于将这些块按照前缀最大值排序。

接下来,同样对于 \(i,j\) 计算期望逆序对。由排序方式,只要 \(i\)\(j\) 是前缀最大值就无法满足条件,再加上 \(a_i,a_j\) 的大小关系同样是均等概率的,所以同样有 \(\frac{1}{2}\) 的期望大小关系,对于 \(i,j\) 就有 \(\frac{i+j-2}{2(i+j)}\) 的期望逆序对。

最后,直接通过归并计算答案即可。

posted @ 2025-02-11 22:34  linxuanrui  阅读(24)  评论(0)    收藏  举报