[学习笔记]容斥?反演?

Posted Arextre

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[学习笔记]容斥?反演?相关的知识,希望对你有一定的参考价值。

\\[\\colorred\\textsf小游者,真神人也,左马桶,右永神,会执利笔破邪炁,何人当之? \\\\ \\beginarray| \\hline \\colorpink\\textA small swimmer is a God. \\\\ \\colorpink\\textThe left toilet and the right eternal God \\\\ \\colorpink\\textcan break the evil energy with a sharp pen. \\\\ \\colorpink\\textWho can resist him? \\\\ \\hline \\endarray \\\\ \\beginarray| \\hline \\colorgreen\\text小遊者は、神であり、左便器、右永神であり \\\\ \\colorgreen\\text鋭いペンを持って真実を突き刺している。誰が彼に抵抗できるだろうか? \\\\ \\hline \\endarray \\\\ \\beginarray| \\hline \\colorlightblue\\textPetit voyageur, est Dieu aussi, toilettes gauche, Dieu éternel droit, \\\\ \\colorlightblue\\textpeut tenir un stylo tranchant pour briser le mal, qui devrait le faire? \\\\ \\hline \\endarray \\\\ \\beginarray| \\hline \\colorpurple\\textDer Direktor ist wirklich ein Gott \\\\ \\colorpurple\\textmit einer Toilette links und Yongshen rechts \\\\ \\colorpurple\\textder einen spitzen Stift hält \\\\ \\colorpurple\\textum die Wahrheit zu durchdringen. \\\\ \\colorpurple\\textWer kann ihm widerstehen? \\\\ \\hline \\endarray \\\\ \\beginarray| \\hline \\colorcyan\\textEin kleiner Schwimmer ist ein Gott. \\\\ \\colorcyan\\textDie linke Toilette und der rechte ewige Gott können \\\\ \\colorcyan\\textdie böse Energie mit einem scharfen Stift brechen. \\\\ \\colorcyan\\textWer sollte es sein? \\\\ \\hline \\endarray \\\\ \\colorred\\textsf对曰:“无人,狗欲当之,还请赐教!” \\\\ \\newcommand\\brak[1]\\left(#1\\right) \\newcommand\\Brak[1]\\left\\#1\\right\\ \\newcommand\\d[0]\\textd \\newcommand\\string[2]\\genfrac\\\\0pt#1#2 \\newcommand\\down[2]#1^\\underline#2 \\newcommand\\ddiv[2]\\left\\lfloor\\frac#1#2\\right\\rfloor \\newcommand\\udiv[2]\\left\\lceil\\frac#1#2\\right\\rceil \\newcommand\\lcm[0]\\operatornamelcm \\newcommand\\set[1]\\left\\#1\\right\\ \\newcommand\\ceil[1]\\left\\lceil#1\\right\\rceil \\newcommand\\floor[1]\\left\\lfloor#1\\right\\rfloor \\newcommand\\rhs[1]\\;\\textRhs\\;#1 \\newcommand\\lhs[1]\\;\\textLhs\\;#1 \\newcommand\\Vec[1]\\vec\\mathbf#1 \\newcommand\\rank[0]\\textrank \\newcommand\\group[1]\\left\\langle\\right\\rangle \\newcommand\\norm[1]\\left|#1\\right| \\]

  部分内容也是 2013 年国家集训队论文《浅谈容斥原理》[1]中的。还有一些来源于《炫酷反演魔术》[2]。另外有一些来源于 \\(\\sf Quack\\) 的课件,最后还有一些杂烂文章就是来源于我自己了......

  不一定完结,随机更新。

基本容斥

  假设有 \\(n\\) 个性质 \\(P_1,P_2,\\cdots,P_n\\),在全集 \\(U\\) 中满足这些性质的元素分别为 \\(S_1,S_2,\\cdots,S_n\\).

  最基本的容斥形式如下:

\\[\\left|\\bigcup_i=1^n S_i\\right|=\\sum_i|S_i|-\\sum_i<j|S_i\\cap S_j|+\\sum_i<j<k|S_i\\cap S_j\\cap S_k|-\\cdots+(-1)^n-1|S_1\\cap S_2\\cap S_3\\cdots \\cap S_n| \\]

  考虑一个属于 \\(T_1,T_2\\cdots,T_m\\) 的元素会被计算多少次:

\\[\\sum_i=1^m (-1)^i-1m\\choose i=-\\brak(1-1)^m-1=1 \\]

  然后,我们可以稍加推广,得到另外的一个形式:

\\[\\norm\\bigcap_i=1^n S_i=\\norm U-\\norm\\bigcup_i=1^n \\barS_i \\]



  举个例子:错位排列。

  对于性质 \\(P_i\\),其表示 \\(\\sigma_i\\neq i\\),而我们的目标是求 \\(\\displaystyle \\norm\\bigcap_i=1^n S_i\\),根据上面的容斥形式,需要用到 \\(\\barS_i\\),其表示满足 \\(\\sigma_i=i\\) 的所有排列,此时我们可以进行容斥了:

\\[\\beginaligned \\norm\\bigcap_i=1^n S_i&=\\norm U-\\norm\\bigcup_i=1^n \\barS_i \\\\ &=n!-\\sum_t=1^n(-1)^t-1\\sum_i_1<i_2<i_3\\cdots<i_t\\norm\\bigcap_k=1^t S_i_k \\\\ &=n!-\\sum_t=1^n(-1)^t-1\\sum_i_1<i_2<i_3\\cdots<i_t(n-t)! \\\\ &=n!-\\sum_t=1^n(-1)^t-1n\\choose t(n-t)! \\\\ &=n!-\\sum_t=1^n(-1)^t-1\\fracn!t! \\\\ &=n!+\\sum_t=1^n(-1)^t\\fracn!t! \\\\ &=n!\\sum_t=0^n(-1)^t\\fracn!t! \\\\ \\endaligned \\]

  化简的关键在于我们发现无论取多少个集合的交,交的大小都只和集合个数有关,这也是错排的通项公式是非指数级的关键。



二项式反演

  前面的公式,其核心还是最开始那个证明的式子:

\\[\\sum_i=1^m (-1)^i-1m\\choose i=-\\brak(1-1)^m-1=1 \\]

  如果你再细心一点,将会发现,同一行的组合数交错和为 \\(0\\),即:

\\[\\sum_i=0^m (-1)^im\\choose i=0 \\]

  严谨地,实际上

\\[\\sum_i=0^m (-1)^im\\choose i=[m=0] \\]

  再来看看前面的错排,如果设 \\(f(n)\\) 表示任意一个排列方案数,\\(g(n)\\) 表示满足了 \\(P\\) 中的 \\(n\\) 个的方案数,那么,我们枚举到底是哪 \\(n\\) 个错开,就可以由 \\(g\\) 得到 \\(f\\)

\\[f(n)=\\sum_i=0^nn\\choose ig(i) \\]

  现在的问题是:\\(f(n)=n!\\),而 \\(g(n)\\) 不知道,也就是说,我们想要从 \\(f\\) 推到 \\(g\\),但是目前只能由 \\(g\\) 得到 \\(f\\).

  但是没有关系,推一推式子,设 \\(\\displaystyle g(n)=\\sum_i=0^nn\\choose i\\lambda(i)f(i)\\),其中 \\(\\lambda(i)\\) 表示容斥系数,那么

\\[\\beginaligned g(n)&=\\sum_i=0^n\\lambda(i)n\\choose i\\sum_j=0^ii\\choose jg(j) \\\\ &=\\sum_i=0^n\\sum_j=0^i\\lambda(i)n\\choose ii\\choose jg(j) \\\\ &=\\sum_i=0^n\\sum_j=0^i\\lambda(i)n\\choose jn-j\\choose i-jg(j) \\\\ &=\\sum_j=0^nn\\choose j\\sum_i=j^n\\lambda(i)n-j\\choose i-jg(j) \\endaligned \\]

  然后就会发现,需要满足 \\(\\displaystyle n\\choose j\\sum_i=j^n\\lambda(i)n-j\\choose i-j=[j=n]=[n-j=0]\\),显然 \\(\\displaystylen\\choose j\\neq 0(j\\in [0,n]\\cap\\Z)\\),因此,\\(\\displaystyle \\sum_i=j^n\\lambda(i)n-j\\choose i-j=[j=n]=[n-j=0]\\),于是:

\\[\\displaystyle \\sum_i=j^n\\lambda(i)n-j\\choose i-j=\\sum_i=0^n-j(-1)^in-j\\choose i \\\\ \\Rightarrow \\sum_i=0^n-j\\lambda(i+j)n-j\\choose i=\\sum_i=0^n-j(-1)^in-j\\choose i \\]

  因此,\\(\\lambda(i+j)=(-1)^i\\),即 \\(\\lambda(i)=(-1)^i-j\\),你发现消不了 \\(-j\\) 这一项,但是没有关系,可以将右边的 \\((-1)^i\\) 改写成 \\((-1)^n-j-i\\),此时你会发现 \\(\\lambda(i+j)=(-1)^n-i-j\\),因此 \\(\\lambda(i)=(-1)^n-i\\).

  其实还有更简单的证明:

\\[f(n)=\\sum_i=0^n\\fracn!i!(n-i)!g(i)\\Rightarrow\\fracf(n)n!=\\sum_i=0^n\\fracg(i)i!\\times \\frac1(n-i)! \\]

  因此,有

\\[\\hat F=\\hat G\\times e^x\\Rightarrow \\hat G=\\hat F\\times e^-x\\Rightarrow \\fracg(n)n!=\\sum_i=0^n\\frac(-1)^n-i(n-i)!\\fracf(i)i!\\Rightarrow g(n)=\\sum_i=0^n(-1)^n-in\\choose if(i) \\]

  两步解决(

  至此,我们得到了二项式反演的一个形式:

\\[f(n)=\\sum_i=0^nn\\choose ig(i)\\Leftrightarrow g(n)=\\sum_i=0^n(-1)^n-in\\choose if(i) \\]

  另外一个形式:

\\[f(n)=\\sum_i=0^n(-1)^in\\choose ig(i)\\Leftrightarrow g(n)=\\sum_i=0^n(-1)^in\\choose if(i) \\]

数论中的容斥原理

  考察 \\(\\varphi(n)=\\norm\\setx|1\\le x\\le n\\land\\gcd(x,n)=1\\),要计算 \\(\\varphi(n)\\),我们可以用 \\(\\displaystyle n=\\prod_i=1^c p_i^t_i\\)\\(n\\) 的所有质因子来进行容斥 —— 因为所谓 \\(\\gcd(x,n)=1\\),实际上就是 \\(x\\) 不含有任何一个 \\(p_i\\),定义性质 \\(P_i\\) 表示元素不含有质因子 \\(p_i\\),那么,目标是 \\(\\displaystyle \\norm\\bigcap_i=1^c S_i\\),又可以进行容斥:

\\[\\varphi(n)=\\displaystyle \\norm\\bigcap_i=1^c S_i=\\norm U-\\norm\\bigcup_i=1^c \\barS_i=n-\\sum_i\\fracnp_i+\\sum_i<j\\fracnp_ip_j-\\cdots+(-1)^c\\fracn\\prod_i=1^c p_i \\\\ \\Rightarrow \\varphi(n)=n\\prod_i=1^n \\brak1-\\frac1p_i \\]

  这就是欧拉公式了。

  当然,如果你足够细心,你会发现我们实际上只在质数上进行容斥,并且在容斥的过程中,取的质数次数均为一次,因此这些质数任意选出一些,他们的乘积仍然是一个__无平方因子数__,而无平方因子数的容斥系数,显然只和其含有多少个质因数有关,因此,我们可以在正整数集上,再定义一个专门针对无平方因子数的函数,它的正负号取决于无平方因子数含有的质数个数,这样,我们就得到了莫比乌斯函数:

\\[\\mu(n)=\\begincases 1&n=1 \\\\[2ex] (-1)^k&n=\\prod_i=1^kp_i \\\\[2ex] 0&\\textotherwise \\endcases \\]

  因此我们可以得到另外的一个关于 \\(\\varphi(n)\\) 的表达式:\\(\\displaystyle \\varphi(n)=\\sum_d\\mid n\\mu(d)\\fracnd\\).

概率论中的容斥

  对于__同一概率空间中__的事件 \\(A_1,A_2,\\cdots,A_n\\),依然存在相似的容斥原理:

\\[\\textP\\brak\\bigcup_i=1^nA_i=\\sum_i\\textP(A_i)-\\sum_i<j\\textP(A_i\\cap A_j)+\\sum_i<j<k\\textP(A_i\\cap A_j\\cap A_k)-\\cdots+(-1)^n-1\\textP\\brak\\bigcap _i=1^n A_i \\]

  对于概率只和事件个数有关,那么还可以简化为:

\\[\\textP\\brak\\bigcup _i=1^n A_i=\\sum_i=1^n(-1)^i-1n\\choose ia_i \\]

一般形式的容斥原理

  对于两个关于集合的函数 \\(f(S),g(S)\\),若

\\[f(S)=\\sum_T\\subset Sg(T) \\]

  那么就有

\\[g(S)=\\sum_T\\subset S(-1)^\\norm S-\\norm Tf(T) \\]

  另外一个形式:

\\[f(S)=\\sum_T\\supset Sg(T)\\Leftrightarrow g(S)=\\sum_T\\supset S(-1)^\\norm S-\\norm Tf(T) \\]

  这个形式只需要将上面取补集即可。

  这两个东西也被称为子集反演。

MinMax容斥(MinMax反演)

  这个东西就是可以让 \\(\\min\\)\\(\\max\\) 到处换过来换过去。最基本的式子:

\\[\\max(S)=\\sum_T\\subset S(-1)^\\norm T+1\\min(T) \\\\ \\min(S)=\\sum_T\\subset S(-1)^\\norm T+1\\max(T) \\]

  证明就考虑每一项是否能对上,由于两个式子长得差不过,就证上面那个。

  考虑当前元素是 \\(S\\) 中第 \\(k\\) 大的,那么这个元素左边的系数就是 \\([k=1]\\),右边的系数,它要作为 \\(T\\) 中最小的,就是只在它或者比它大的元素中选,因此右边的系数是 \\(\\displaystyle \\sum_i=1^k(-1)^i+1k-1\\choose i-1=\\sum_i=0^k-1(-1)^i+2k-1\\choose i=\\sum_i=0^k-1(-1)^ik-1\\choose i=[k-1=0]=[k=1]\\),得证。

  它还可以推广为 \\(\\rm kthmax\\),设 \\(\\textkthmax(S)\\) 表示 \\(S\\) 中第 \\(k\\) 大的,它依然可以使用 \\(\\min\\) 来表达,至于容斥系数,考虑使用待定系数法来解,假设当前的元素是第 \\(p\\) 大的,那么我们要解的是

\\[\\beginaligned [p=k]&=\\sum_i=1^p\\lambda(i)p-1\\choose i-1 \\\\ &=\\sum_i=0^p-1\\alpha(i)p-1\\choose i&\\alpha(i)=\\lambda(i+1) \\\\ \\endaligned \\]

  将其二项式反演,可以得到

\\[\\alpha(p-1)=\\sum_i=0^p-1(-1)^p-1-ip-1\\choose i[i=k-1]=(-1)^p-kp-1\\choose k-1 \\]

  因此 \\(\\displaystyle \\lambda(i)=\\alpha(i-1)=(-1)^i-ki-1\\choose k-1\\),所以可以得到 \\(\\rm kthmax\\) 的式子:

\\[\\textkthmax(S)=\\sum_T\\subset S,\\norm T\\ge k(-1)^\\norm T-k\\norm T-1\\choose k-1\\min(T) \\]

  当然,它也是可以用在期望上面的:

\\[E(\\max(S))=\\sum_T\\subset S(-1)^\\norm T+1E(\\min(T)) \\]

  然后它就可以做题了。

先写到这里

  还有的斯特林反演之类的东西......




  1. 作者:王迪(成都七中) ↩︎

  2. 作者:\\(\\sf VFleaKing\\)↩︎

以上是关于[学习笔记]容斥?反演?的主要内容,如果未能解决你的问题,请参考以下文章

「总结」容斥。二.反演原理 5.划分容斥

「总结」容斥。二.反演原理

二项式反演及其应用

容斥 反演

最值反演 min-max容斥

(HDU 1695)GCD(容斥+莫比乌斯反演)