首页 > 其他分享 >组合数学(容斥与反演)

组合数学(容斥与反演)

时间:2024-10-15 17:48:21浏览次数:1  
标签:函数 sum 元素 容斥 反演 数学 choose dp

前言

校测被数学干碎了,赶紧来补一点容斥和反演的东西,能补多少算多少吧。

特别说明:这一篇学习笔记是组合数学的第二篇。

反演

这是一个听着很高大上,实际不简单(因为wtcl)的东西。

反演的实质

对于形如下面的式子,我们称左右两式互为反演式:

\[f_i=\sum^{i}_{j=1}A_{i,j}g_j\Leftrightarrow g_i=\sum_{j=1}^iB_{i,j}f_j \]

然后 \(f\) 和 \(g\) 可以看成只有一行的矩阵(也就是向量),这个式子就可以看成矩阵乘法求逆(解向量)。

子集反演

首先我们需要知道子集反演解决什么样的问题:在恰好是某个集合至少/至多是此集合之间转换。

如果我们求一个特定的符合要求的集合 \(A\),设 \(f(S)\) 表示 \(A=S\) 的答案,\(g(S)\) 表示 \(S\subseteq A\) 的答案,我们钦定选择了 \(T\subseteq S\),就有 \(g(S)=\sum_{T\subseteq S}f(T)\),反演得到:\(f(S)=\sum_{T\subseteq S}(-1)^{|S|-|T|}g(T)\)。

证明:将两个式子代一下即可,在此不给出详细证明,后面二项式反演会证,可以参考其证法。

二项式反演

二项式反演是最常见的反演之一,下面给出两种形式并证明第一种。

形式一

\[f(n)=\sum^{n}_{i=m}{n\choose i}g(i)\Leftrightarrow g(n)=\sum^{n}_{i=m}(-1)^{n-i}{n\choose i}f(i) \]

形式二

\[f(n)=\sum^{n}_{i=m}{i\choose m}g(i)\Leftrightarrow g(n)=\sum^{n}_{i=m}(-1)^{i-m}{i\choose m}f(i) \]

形式一证明:

\[\begin{aligned} f(n)&=\sum^{n}_{i=m}{n\choose i}g(i)\\ &=\sum^{n}_{i=m}{n\choose i}\sum^{i}_{j=m}(-1)^{i-j}{i\choose j}f(j)\\ &=\sum^{n}_{j=m}f(j)\sum^{n}_{i=j}{n\choose i}{i\choose j}(-1)^{i-j}\\ &=\sum^{n}_{j=m}f(j)\sum^{n}_{i=j}{n\choose j}{n-j\choose i-j}(-1)^{i-j}\\ &=\sum^{n}_{j=m}f(j){n\choose j}\sum^{n}_{i=j}{n-j\choose i-j}(-1)^{i-j}\\ &=\sum^{n}_{j=m}f(j){n\choose j}\sum^{n-j}_{i=0}{n-j\choose i}(-1)^{i}\\ &=\sum^{n}_{j=m}f(j){n\choose j}[n=j]\\ &=f(n) \end{aligned} \]

形式二类似。

常见形式

对于求恰好若干个元素满足条件的题目,若不能直接求,可以考虑先转化成钦定有若干个元素满足条件再套上二项式反演。

例题

BZOJ2839 集合计数

简要题意

一个有 \(N\) 个元素的集合有 \(2N\) 个不同子集(包含空集),现在要在这 \(2N\) 个集合中取出若干集合(至少一个),使得它们的交集的元素个数为 \(K\),求取法的方案数,答案模 \(10^9+7\)。

数据范围:\(1\le K\le N\le10^6\)。

题解

我们设 \(f(i)\) 表示选出子集大小恰好为 \(i\) 的方案数,然而我们发现这个东西不好转移。但是,如果我们先求出一个限制条件少一点但是比较好求的东西 \(g(i)\) 再去求 \(f(i)\) 就会简单许多(也许。

于是就有 \(g(i)\) 表示钦定 \(i\) 个元素在交集中(其他元素不考虑),这样 \(g(i)\) 就比较好求了,我们可以把 \(g(i)\) 的式子写出来:\(g(i)={n\choose i}(2^{2^{n-i}}-1)\)。为什么呢?首先我们需要从 \(n\) 个元素中选择 \(i\) 个元素,所以有 \(n\choose i\),然后对于剩下 \(n-i\) 个元素,我们可以列举出可能存在的集合的可能,也就是 \(2^{n-i}\) 种可能,对于这些集合我们可以选可以不选,但是题目要求至少选一个,所以就是一个 \(2^{n-i}\) 元集去掉空集,然后选的元素与不选的元素之间互有影响所以是乘法原理。

然后就是去找 \(f\) 与 \(g\) 的关系了。其实对于 \(g\),我们还有另一种求法:\(g(i)=\sum^n_{j=i}{j\choose i}f(j)\)。其实就是对于选出子集大小恰为 \(j\) 的方案中再去选出 \(i\) 个,与第一种方法等价。

然后看到后面这坨直接二项式反演就可以得到:

\[f(i)=\sum^n_{j=i}(-1)^{j-i}{j\choose i}{n\choose j}(2^{2^{n-j}}-1) \]

然后直接算就行。

P4859 已经没有什么好害怕的了

简要题意

有两个序列 \({a_i},{b_i}\) 保证所有元素互不相同。你需要重排 \(b\) 序列,使得恰好有 \(k\) 个 \(i\) 满足 \(a_i>b_i\)。

\(0<k\leq n\leq2000\)

题解

因为每一个 \(a,b\) 关系都是相对独立的,所以可以先对 \(A=\{a_i\}\) 排序。

然后就能想到一个 \(dp_{i,j}\) 表示考虑前 \(i\) 对,恰好有 \(j\) 对满足条件,设 \(f_i\) 表示所有数中恰有 \(i\) 对的方案,所以 \(f_i=(n-i)!dp_{n,i}\),且 \(f_k\) 即为最后答案。然后就做完了!

但是这个东西似乎无法直接转移((,所以我们需要换一下思路,那么不妨放宽条件,我们重新定义一个 \(dp_{i,j}\) 表示钦定 \(j\) 对满足条件,设 \(g_i\) 表示所有数中钦定有 \(i\) 对的方案,然后稍加讨论就能转移了:

\[dp_{i,j}=dp_{i-1,j}+dp_{i-1,j-1}\times(cnt(a_i)-j+1) \]

其中 \(cnt(a_i)\) 表示 \(B=\{b_i\}\) 中比 \(a_i\) 小的数的个数,这个似乎可以直接维护。

然后我们可以找找 \(f\) 与 \(g\) 的关系(这不就是二项式反演的组合意义吗),然后因为:

\[(n-i)!dp_{n,i}=g(i)=\sum\limits_{j=i}^n\dbinom ji f(j) \]

根据二项式反演有:

\[f(k)=\sum\limits_{i=k} ^n{(-1)^{n-i}\dbinom ik(n-i)!dp_{n,i}} \]

莫比乌斯反演

对于一些函数,我们无法快速求出其值,但可以快速求出其倍数或约数的值,我们就能通过莫比乌斯反演快速求值。

积性函数

定义:若一个数论函数 \(f(n)\) 满足 \(f(pq)=f(p)\times f(q),\gcd(p,q)=1\),则称 \(f(n)\) 是一个积性函数。如果 \(\gcd(p,q)=k,k\in Z\),仍能满足上式则称 \(f(n)\) 为完全积性函数。

性质:若 \(f(n)\) 与 \(g(n)\) 均为积性函数,则下面函数均为积性函数:

  1. \(h(x)=f(x^p)\)
  2. \(h(x)=f^p(x)\)
  3. \(h(x)=f(x)g(x)\)
  4. \(h(x)=\sum_{d|x}f(d)g(\frac{x}{d})\)

常见积性函数

  • 单位函数 \(\epsilon(n)=[n=1]\)。
  • 常数函数 \(1(n)=1\)。
  • 幂函数 \(id_k(n)=n^k\),其中 \(id_1(n)\) 简记为 \(id(n)\)。
  • 因数个数函数 \(d(n)=\sum_{d|n}1\)。
  • 除数函数 \(\sigma_k(n)=\sum_{d|n}d^k\),其中 \(k=0\) 时就是因数个数函数,\(k=1\) 时为因数和函数,简记为 \(\sigma(n)\)。
  • 欧拉函数 \(\varphi(n)=\sum^n_{i=1}[\gcd(i,n)=1]\)。
  • 莫比乌斯函数 \(\mu(n)\)。

参考资料

子集反演学习笔记

部分经典反演的推导附矩阵形式

『组合数学总结1:基础组合数学和组合原理』

标签:函数,sum,元素,容斥,反演,数学,choose,dp
From: https://www.cnblogs.com/Nekopedia/p/18468076

相关文章

  • 数学建模习题6.2
    edges=[("Pe","T",13),("Pe","N",68),("Pe","M",78),("Pe","L",51),("Pe","Pa",51),("T","N",68),("T","M......
  • 数学建模习题6.3
    importheapqdefprim(graph,start):num_nodes=len(graph)visited=[False]*num_nodesmin_heap=[(0,start,-1)]mst_cost=0mst_edges=[]whilemin_heap:weight,u,parent=heapq.heappop(min_heap)ifvisited[u]:continue......
  • 数学建模习题5.4
    importnumpyasnpfromscipy.optimizeimportminimizedefobjective(x):return-np.sum(np.sqrt(x)*np.arange(1,101))defconstraint1(x):returnx[1]-10defconstraint2(x):return20-(x[1]+2*x[2])defconstraint3(x):return30-(x[1]+2x[2]+3x......
  • 数学建模习题5.5
    importnumpyasnpfromscipy.optimizeimportminimizedefobjective(x):return2x[0]+3x[0]2+3*x[1]+x[1]2+x[2]defconstraint1(x):return10-(x[0]+2x[0]**2+x[1]+2x[1]**2+x[2])defconstraint2(x):return50-(x[0]+x[0]2+x[1]+x[1]2......
  • 数学建模习题5.7
    total_demand=sum(demands)dp=np.full((4,total_demand+1),float('inf'))dp[0][0]=0prev_production=np.full((4,total_demand+1),-1)foriinrange(1,4):prev_demand=sum(demands[:i-1])forjinrange(total_demand+1):ifj<pr......
  • 数学建模习题4.4
    `MAX_B=24MAX_DEBUG=5products=[{"name":"Ⅰ","A_hours":1,"B_hours":6,"debug_hours":1,"profit":2},#假设产品Ⅰ至少使用1小时设备A{"name":"Ⅱ","A_hours":5,"......
  • 数据库系统——数学模型
    数学模型前言三级模式两种映射一、基本概念1.概念模型2.逻辑模型3.物理模型二、四个世界三、概念世界和概念模型1.E-R模型(实体-关系模型)2.EE-R模型3.面向对象模型(OO模型)4.谓词模型四、信息世界和逻辑模型关系模型五、计算机世界和物理模型前言三级模式内模式内......
  • 数学建模习题3.3
    importnumpyasnpfromscipy.sparse.linalgimporteigsimportpylabaspltw=np.array([[0,1,0,1,1,1],[0,0,0,1,1,1],[1,1,0,1,0,0],[0,0,0,0,1,1],[0,0,1,0,0,1],[0,0,1,0,0,0]])r=np.sum(w,axis=1,keepdims=True)n=w.sha......
  • 数学建模习题2.4
    importnumpyasnpimportmatplotlib.pyplotasplt定义x的范围x=np.linspace(-10,10,400)创建一个2行3列的子图布局fig,axs=plt.subplots(2,3,figsize=(12,8))遍历每个子图fork,axinenumerate(axs.flat,start=1):y=k*x**2+2*kax.plot(x,y,label......
  • 数学建模习题2.6
    importnumpyasnpimportmatplotlib.pyplotaspltfrommpl_toolkits.mplot3dimportAxes3D模拟高程数据(假设数据已经过某种方式插值或生成)这里我们创建一个简单的40x50网格,并填充随机高程值x=np.linspace(0,43.65,40)y=np.linspace(0,58.2,50)X,Y=np.meshgr......