正睿省选第一轮集训 Day 2 组合计数

写出了所有题的解法。当然都没写代码。很多解法的深刻含义和启发意义还有待挖掘。当然其中有很多只不过是经典套路罢了。

LNOI2022 盒

n 个盒子,初始第 i 个盒子里有 ai 个物品。每次可以从 aiai+1 移动一个物品,代价是 wi0。对于 b 满足 bi=ai,设它的权值是通过以上操作从 a 变成 b 的最小代价。对所有可能的 b 求权值之和。

2n5×105,1ai2×106。数据范围最大的数据有 5 组多测询问。

A,Ba,b 的前缀和,则 val(b)=wi|AiBi|。于是可以算每一位的贡献。则第 i 位的贡献是:

wij=0m|Aij|(i1+ji1)(ni1+mjni1)

于是做到 Θ(nm) 是十分容易的。接下来对于绝对值,进行分类讨论,所求式即(只写出下半部分, jAi 部分同理):

j=0Ai(Aij)(i1+ji1)(ni+1+mjni+1)=Aij=0Ai(i1+ji1)(ni+1+mjni+1)j=0Aij(i1+ji1)(ni+1+mjni+1)

设前半部分为 Aif(n,m,Ai,i)。后半部分可以把 j 吸收进组合数,变成 j=0Aii(i1+ji)(ni+1+mjni+1),于是变成if(n+1,m1,Ai1,i+1),于是问题变成了只需要求 f。注意到我们很容易使 Ai 增加 1,如果也可以使 i 增加 1,由于 Ai 单调递增,我们可以在总共 Θ(n+m) 复杂度内求出所有需要的 f。 考虑这类问题经典(?)的处理方法:其组合意义是 n1 个板和 m 个球,要求第 i 个板前有不超过 Ai 个球的方案数。将其转化为要求第 Ai+1 个球之前有至少 i 个板,即:

f(n,m,Ai,i)=j=in1(Ai+jAi)(mAi1+n1jmAi1)

注意特殊讨论掉 Ai=m 的情况。这种形式非常方便对 i 进行改变,于是做完了。

CTS2019 随机立方体

给一个 n×m×l 的立方体每个位置用标互不相同的标号,如果一个位置在它所在的三个平面中都是最小值,那么说它是极小值。求有恰好 k 个极小值的方案数。1T10,1n,m,l5×106,1k100

首先容斥一下,现在钦定有 k 个极小值,这些极小值显然互不共面。首先选出这些位置,给它们钦定好彼此的顺序,再分配好完全无关的位置的标号。接下来,所有至少与一个极小值共面的点会被挂到它所属的最大的极小值下面,而极小值之间按照从大到小连边形成一条链。这个结构就形如一棵树,而我们要做的就是这个树的拓扑序计数。根据拓扑序计数的经典结论答案是 tot!1szu,于是做完了。

重返现世

感觉费伦确实非常可爱,但是我已经一辈子都忘不掉大喷菇这茬了。总有一天?就在今天!

QOJ7759 Permutation Counting 2

从这里开始都是有意思的题。另外晓美焰昨天和我说在 Edge 浏览器中 F12 启动控制台以后 Ctrl+Shift+P 启动命令面板,输入 javascript 就可以检索到禁用的选项,然后 QOJ 上的数学公式就会显示成 LaTeX 源码形式。

给定 n,对于每组 x,y[0,n) 求出有多少个 1n 的排列 p 满足以下条件:

  • i=1n1[pi<pi+1]=x
  • i=1n1[pi1<pi+11]=y

其中 p1 表示 p 的逆排列,满足 ppi1=i

1n500

通过所谓的 连续段 DP,我们轻松做到 n5。其实处理这类问题这个方法是非常套路的,如果有用的话就不至于出到集训队互测里去了。这是一道很厉害的容斥题。

首先容斥一下。现在在排列和逆排列中分别有 x,y 个被钦定了顺序的相邻位置,显然各自组成 nx,ny 个连续上升段。一个一个考虑逆排列中的连续上升段,其实这是在说 1k 这些元素的位置在原排列中是从前往后的。对于每个原排列中的段,这些元素会占据一个前缀。考虑一个 (nx)×(ny) 的矩阵 CCi,j 表示第 i 个原排列中有多少个是在逆排列中的第 j 段的。那么合法的矩阵满足没有空行或空列,并且这种矩阵和原排列一一对应。这样我们只需要对没有空行列的限制再度容斥,总时间复杂度 n3

QOJ6555 Sets May Be Good

给定一个 n 个点的无向图,求有偶数条边的点导出子图数量对 998244353 取模。1n1000

经典的对称性。考虑一号点,如果被选中的其它点和它连边的数目为奇数,那么选或不选这个点恰有一种合法。可以计算出这个方案数。接下来扔掉这个点,相当于固定和它有边的集合里要选择偶数个点,然后还要合法的方案数。不妨设这个集合非空,则相当于集合里的第一个点选不选取决于集合里的其它点选不选。

将这个过程代数化很容易观察到,而直接思考可能不容易观察到的一个做法是:将这个集合里第一个点的所有边都给到剩下集合里的所有点,然后删掉这个点变成子问题。这个过程当然可以用 bitset 优化到 Θ(n3w),于是做完了。

QOJ7303 City United

给定一个 n50 个点的无向图,保证对于每条边 (u,v) 均有 |uv|d13,求连通点导出子图数量。答案对 2 取模。

首先可以用 Bell 数状压做 mod998244353。这里要做到更好的复杂度就需要利用模 2 的性质。

考虑一个类似容斥的做法:我们计算不合法的方案数,即枚举两个非空集合都被选择,且它们之间无边,而剩下的点都不选。考虑一个不合法方案会被算几次,假设有 x 个连通块,那么会算 2x2 次。我们在 mod4 意义下计算,那么所有合法方案不会被算,不合法方案会带上 2 的系数。于是直接三进制状压 DP 一下即可。

QOJ5357 芒果冰加了空气

这么啥比的题为什么不会做呢?

给一棵树,求点分树方案数。n5000

注意到,假设我们有一棵树和它对应的点分树方案,从中断开一条边,我们可以唯一得到产生的两个连通块的一种点分树方案。那么反过来考虑有两棵树,分别已经求出了内部的点分树方案,用一条边 (u,v) 连接它们,该如何合并得到新的点分树方案。我们可以先选择两棵点分树的根中的一个作为新根,然后递归合并这个根的子树与另一个点分树。这样相当于将 u,v 在对应点分树上到根的链相互任意合并。这样我们只关心这两条链的长度。于是在树形 DP 的过程中,记录当前子树根在点分树上的深度。合并很容易做到树形背包的复杂度。

QOJ2566 Inversions

对若干次幂计数的新视角,不过按照阿勒法的说法和斯特林数本质相同。

求长度为 n 的排列的逆序对数目的 m 次方之和对 998244353 取模。1n1018,1m103

Bonus:1m105

首先我们有经典的斯特林数加组合意义做法,不幸的是似乎只能做到 m3。考虑写出长度为 n 排列的逆序对个数的生成函数 Fn(z)=1zn1zFn1(z),且 F0(z)=1,那么有 Fn(z)=i=1n1zi1z

结论:一个东西的生成函数是 F(z),则它 k 次幂的和是 k![zk]F(ez)。证明如下:

[zk]F(ez)=i=0fi[zk]eiz=i=0fiikzkk!

于是我们给 Fn(z) 复合上 ez,得到:

Ans=m![zm]i=1n1ezi1ez=m!n![zm]i=1n1eziziz1ez=m!n![zm]exp((i=1nln(1ezizi))nln(1ezz))

不妨设 G(z)=ln(1ezz)=i=0gizi,则:

Ans=m!n![zm]exp(i=0gizi((t=1nti)n))

到这里就非常容易了。对于所有 0im 求出 si=(t=1nti)n,这个当然可以预处理斯特林数做到 m2,然后用。然后 exp 回去即可。注意到 ln,exp 都等等都可以平方,所以不需要 NTT,时间复杂度 Θ(m2)

对于 Bonus Problem,当然后半部分需要用 NTT 等实现多项式操作;而 s 的求解可以直接利用先前的 k 次幂和计算技巧:si=i![zi]t=1netz=i![zi]ez1enz1ez。也用一些多项式操作来求即可。时间复杂度 Θ(mlogm)

QOJ7838 往日之影

啊?

T 组数据,给定 a03,n=ai,求有多少个简单无向图,满足度数 mod4=i 的点数恰好为 ai。答案对素数 P 取模。1T105,1n106

通过单位根反演刻画度数 mod4 的限制(ci 表示 i 号点要求的度数 mod4 结果,满足有 ati 使得 ci=t):

Ans=Ei=1n[4|dici]=Ei=1n14j=03ω4(dici)j

对于式子的后半部分,直接对于每个 i 枚举选择 j={0,1,2,3} 中的哪一个,设 qi=ω4j,那么:

Ans=14nqEi=1nqidici=14nq(i=1nqici)(u<v(1+quqv))

注意到四次单位根满足 1+ω41ω41=1+ω40ω42=1+ω43ω43=0,所以后面的乘积式很多时候为 0,实际上我们只允许最多一个 1 一个 3,且 0,2 不能同时出现。所以可行的染色方案数非常少,直接枚举计算。

未完待续

posted @   kyEEcccccc  阅读(438)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示