SS-组合记数

news/2025/2/11 22:35:59/文章来源:https://www.cnblogs.com/linxuanrui/p/18710611

组合计数

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)}\) 的期望逆序对。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/882290.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4.2 内存的逻辑模型是楼房

编程语言中的数据类型表示存储的是何种类型的数据 根据程序中所指定的变量的数据类型的不同,读写的物理内存大小也会随之发生变化 在不同的编程语言中,变量可以指定的数据类型的最大长度也不相同 C语言中,8字节(=64位)的double类型是最大的

题解:SP6517 JOCHEF - Farmer Sepp

怎么题解全是 dp?可以用笛卡尔树啊!笛卡尔树的介绍 笛卡尔树,是一种二叉搜索树,它满足如下条件:每个节点的编号满足二叉搜索树的性质。 每个节点的权值满足小根堆或大根堆的性质。大概是这个样子:笛卡尔树的建树 请看这里。 笛卡尔树的用途 它可以用来解决区间最值问题,…

4.1 内存的物理机制很简单

内存实际上是一种名为内存IC的电子元件。 内存IC中有电源、地址信号、数据信号、控制信号等用于输入输出的大量引脚(IC的引脚),通过为其指定地址,来进行数据的书写。 虽然这是一个虚拟的内存IC,但他的引脚和实际的内存IC是一样的。1024=1K 8位=1字节 计算机使用的内存IC中…

洛谷P1191 矩形 题解

笛卡尔树的介绍 笛卡尔树,是一种二叉搜索树,它满足如下条件:每个节点的编号满足二叉搜索树的性质。 每个节点的权值满足小根堆或大根堆的性质。大概是这个样子:笛卡尔树的建树 请看这里。 笛卡尔树的用途 它可以用来解决区间最值问题,它有一个重要性质:当这个笛卡尔树为小…

洛谷P2701 [USACO5.3] 巨大的牛棚Big Barn 题解

怎么题解全是清一色的 dp?可以用笛卡尔树啊(虽然麻烦了很多,但是我热爱)!笛卡尔树的介绍 笛卡尔树,是一种二叉搜索树,它满足如下条件:每个节点的编号满足二叉搜索树的性质。 每个节点的权值满足小根堆或大根堆的性质。大概是这个样子:笛卡尔树的建树 请看这里。 笛卡尔…

告别 DeepSeek 系统繁忙,七个 DeepSeek 曲线救国平替入口,官网崩溃也能用!

前言 DeepSeek作为一款备受瞩目的国产大模型,以其强大的功能和卓越的性能赢得了众多用户的青睐。然而,随着用户量的激增,DeepSeek官网近期频繁遭遇服务器繁忙甚至崩溃的问题,给广大用户带来了不小的困扰。面对这一现状,许多用户急于寻找能够替代或绕过官网限制的方法,以继…

第一章笔记

1.2CPU是寄存器的集合体 程序是把寄存器作为对象来描述的。 通常我们将汇编语言编写的程序转化成机器语言的过程称为汇编;反之,机器语言程序转化成汇编语言程序的过程则称为反汇编。 汇编语言采用助记符(memonic)来编写程序,每一个原本是电气信号的机器语言 指令都会有一个…

ARC191 192 题解

ARC191 题解 A - Replace Digits简要题意给定一个长为 \(n\) 的字符串 \(a\)。\(m\) 次操作,第 \(k\) 次给定一个字符 \(b_k\),你需要选择一个 \(i \in [1, n]\) 并将 \(a_i\) 替换成 \(b_k\)。 求最后能得到的所有字符串中,字典序最大的是什么。 \(1 \leq n, m \leq 10^6\)…

最近,测试的招聘市场已经疯掉了…

这是我入行测试的第1007天,门槛低,技术难度不高,食物链最底端。出现严重的bug,首先背锅的就是测试...📝 博主首页 : 「码上生花」 ,同名公众号 :「伤心的辣条」📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口…

P1083 [NOIP 2012 提高组] 借教室(差分)

说实话竟然没想到还能这样差分,这道题我们需要二分查找m个订单,对于每次二分用一次差分,然后看如果只考虑1到mid个订单是否会出现教室不够用的情况,如果够用说明导致教室不够用的订单在后面,应该让begin=mid+1;反之让end-1;其实这道题就是让我们找第一个出现教室不够用的…

来吃糖

先放犯错后 be like:1 return // 倍增求 lca int bfs(int x) {queue<int> q;q.push(x);dep[x] = 1;while (q.size()) {x = q.front(), q.pop();for (auto it : G[x]) {int y = it.first, z = it.second;if (dep[y]) continue;dep[y] = dep[x] + 1;d[0][y] = z;f[0][y] =…

P9330 [JOISC 2023] JOI 国的节日 2 题解

Description 对于以下问题:给定长度为 \(n\) 的序列 \(a\)、\(b\),满足以下条件:在序列 \(a\) 与序列 \(b\) 中,\(1\) 到 \(2n\) 的整数各出现恰好一次; 对于 \(1\leq i\leq n\),\(a_i<b_i\); 对于 \(1\leq i<n\),\(a_i<a_{i+1}\)。求:最多能在 \([a_i,b_i]\…