组合计数
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}\) 的多项式的项数,则:
可得 \(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)}\) 的期望逆序对。
最后,直接通过归并计算答案即可。