计数 / 组合数学 学习笔记

组合数等式

第一个等式:i=0m(n+in)=(n+1n+m+1)

组合意义:从 n+m+1 个球里面选 n+1 个球,枚举第 n+1 个球的位置 n+1,n+2,,n+m+1。那么前面就剩下 n,n+1,,n+m 个空位,从这些空位里选出 n 个位置放下 n 个球,方案数是 (n+in)

第二个等式:i=0m(ni)(mki)=(n+mk)

组合意义:?

第三个等式:(ni)(ij)=(nj)(niij)

组合意义:从 n 个球里选 i 个球,再从这 i 个球里选 j 个球,等价于先选出最后这 j 个球,再选出第一步被选出但第二步没被选出的这 ij 个球。

二项式定理

(a+b)n=i=0n(ni)aibni

凯莱定理

基础版本:n 个点的有标号无根树共有 nn2 种。

扩展版本:n 个点,共有 s 棵树的森林共有 snns1 种。

Sasha and Interesting Fact from Graph Theory

枚举 ab 中间的边数 i,那么考虑:

  • 用了 i+1 个点,除了 a,b 还有 i1 个,方案数是 (n2i1)

  • 选出的 i1 个点可以乱排,方案数是 (i1)!

  • 赋边权相当于在 m1 个空内插 i1 个板,方案是数 (m1i1)

  • 其他边没有限制,方案数 mn1i

  • 其他的点要挂在这 (i+1) 个点下面,由凯莱定理,得方案数是 (i+1)nn(i+1)1

所以总方案就是:

i(n2i1)(m1i1)(i1)!mni1(i+1)nn(i+1)1

容斥原理

Lemma 1

i=0n(1)i(ni)=[n=0]

证明:考虑使用二项式定理,将原式转化为

i=0n(1)i1ni(ni)=(1+1)n=0n

n=0 时,原式无意义,将 n=0 带入左式得数为 1,故得证。

Lemma 2

|i=1n|Si=T{1,2,,n},T(1)|T|1|jTSj|

二项式反演:

f(x)=i=0x(1)i(xi)g(x)g(x)=i=0x(1)i(xi)f(i)

证明:

f(x)=i=0x(1)i(xi)j=0i(1)j(ij)f(j)

=i=0xf(i)j=ix(1)i+j(xj)(ji)

=i=0xf(i)j=ix(1)i+j(xi)(xiji)

=i=0x(xi)f(i)j=ix(1)i+j(xiji)

=i=0x(xi)f(i)j=0xi(1)2i+j(xij)

=i=0x(xi)f(i)j=0xi(1)j(xij)

=i=0x(xi)f(i)[xi=0]

=(xx)f(x)

=f(x)

[ABC276G] Count Sequences

biai 的差分数组,ab 唯一对应。

那么问题转化为对满足以下条件的 b 计数:

b 全部非负,bi(2in)3 的余数为 12bm

考虑确定一下 b1mod3 的值,因为只有两种。它不需要递增啊!

假设 b1=a+3k,其余的 b 中有 r 个模 32,那它们对和的占用就是 a+r+n1,剩下的就是 marn+1,现在我们补上一堆 3k,那么这个量不会超过 S=marn+13

这部分的方案数是 i=1S(n+i1n1)=(n+Sn)。做完了捏。

第一个有用的东西是数列不减考虑差分,也便于刻画相同的情况。

二是考虑算重,直接用幂的情况必须完全互不影响,先给 1 放上再给 2 放上,和先给 2 放上再给 1 放上显然是相同的。

[ABC180F] Unbranched

首先转化一下题目:求有 n 个点,m 条边,每个联通块都是链或简单环且大小不超过 L 的方案数。

dp,设 fi,j 表示处理了 i 个点,j 条边的图的方案数,这里的“处理了”并不是指在编号上的选取,而是目前规划的图的点数,这一点要格外注意。转移时考虑枚举新一个联通块的大小。

这样显然会算冲,因为我们钦定了联通块的顺序,那怎么办呢。我们可以使用选取基准点的思想,枚举的是当前未被选取的编号最小的点所在的联通块大小,那么这样就非常对了。这种思想在计数题中非常重要。

方程其实不难想到,分成链和环两部分。

链:fi,j=k=1min(n,L,j+1)fik,j(k1)(n(ik)1k1)k!2。含义是先从剩下的点中选 k 个,但是钦定了一个,所以要减一。后面则是 k 个点的链的方案数。除二是因为每种排列方式反过来本质一样。

环:fi,j=k=2min(n,L,j)fik,jk(n(ik)1k1)(k1)!2。最后那个是因为环循环同构,所以要在排列数上除掉点数。

注意联通块的上下界和一个特判:如果当前的阶乘为 1,那么就不要再除二了。

初值显然为 f0,0=1,答案为 fn,m,时间复杂度 O(n2m)

[AGC041D] Problem Scores

条件三是前 k+1 个数的和要大于后 k 个数的和。

有没有可能某个 k 的限制是最紧的呢?确实是这样的。考虑 k=n2,那么 k 变小左边去掉得数不大于右边去掉的数,一直满足,k 变大出现交集,去掉交集后转化为 k 变小。

现在要求你前 k+1 个数大于后 k 个数,咋做呢。

考虑维护这两个和的差值。初始时令所有数都为 n。单调不减转化为每次拿出一个前缀减一。可以计算出每个前缀 [1,i] 对差值的减小量。

你只需要从里面选出若干个,每个可以选多次,使得它们的和不超过 n1。如果超过了就不是严格大于了,完全背包即可。

这里的背包应该倒着做,我们原来完全背包正序循环是为了让先更新的能更新后更新的,同理,现在应该倒序循环。

P9745「KDOI-06-S」树上异或

考虑值域小的做法,设 fx,v 表示不考虑以 x 为根的子树外面的,仅考虑它里面,且根所在的连通块异或和为 v 的各个方案分出的连通块的权值和。

转移考虑如果这条边不断,那么跟所在的连通块会与这个子节点权值发生异或;如果断,就要乘上这个子节点连通块的权值。

所以 fy,j×fx,ijfx,ify,j×j×fx,ifx,i。注意要先存下来之前的 f,防止第一个相互转移。

优化只需考虑把每一位分别计算即可,记 fx,p,i 表示第 p 为值为 i 的结果,转移变化为。

fx,p,j×fy,p,ijfx,p,i,fx,p,i×2j×fy,j,1fx,p,i

对于子节点的第二个转移,我们计算的是 fx,p,i×(2j×fy,j,1),容易提前计算,时间复杂度 O(nlogV)

posted @   aCssen  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示