zoukankan      html  css  js  c++  java
  • 组合数学

    排列组合

    排列

    (n)个不同的元素中取出(m)个的方案数,记为(A(n,m))(P(n,m))

    [A(n,m)=frac{n!}{(n-m)!} ]

    组合

    (n)个相同的元素中取出(m)个的方案数,记为(C(n,m))(inom{n}{m})

    [C(n,m)=frac{n!}{m!(n-m)!} \ C(n,m)=C(n-1,m)+C(n-1,m-1) \ sum_{i=0}^m C(n,i)=C(n+1,m+1) ]

    隔板法

    (m-1)个相同隔板把(n)个相同元素分成(m)部分(可以有两个隔板插在同一个空隙)
    方案数:$$C(n+m-1,m-1)=C(n+m-1,n)$$

    容斥原理

    [|igcup_{i=1}^n S_i|=sum_{m=1}^n (-1)^{m-1}sum_{a_i<a_{i+1}} |igcap_{i=1^m} S_{a_i}| ]

    不定方程非负整数解计数

    给出不定方程(sum_{i=1}^n x_i=m)(n)个限制条件(x_ile b_i) ,其中(m,b_iin mathbb{N})。求方程的非负整数解的个数。

    考虑求有限制(x_igeq b_i+1)的不定方程非负整数解个数。
    将每个有限制的(x_i)减去(b_i+1),就去掉了限制。
    这样,答案(=inom{m-1}{m+n-1})
    将原问题用容斥转化成上述问题计算即可。

    数论中的容斥

    欧拉函数,莫比乌斯反演

    容斥原理一般化

    [f(S)=sum_{Tsubseteq S}g(T) \ g(S)=sum_{Tsubseteq S}(-1)^{|S|-|T|} f(T) ]

    二项式反演

    [f(n)=sum_{i=0}^n inom{n}{i} g(i) \ g(n)=sum_{i=0}^n (-1)^{n-i} inom{n}{i} f(i) ]

    证明

    假设有(n)个集合(A_i),任意(k)个集合的交集都是(g_k),任意(k)个集合补集的交集都是(f_k)。由容斥原理,

    [f_n=g_0-inom{n}{1}g_1+inom{n}{2}g_2+dots+(-1)^ninom{n}{n}g_n \ g_n=f_0-inom{n}{1}f_1+inom{n}{2}f_2+dots+(-1)^ninom{n}{n}f_n ]

    应用

    在实际应用中,我们往往设(f(i))表示“恰好有(i)个”,(g(i))表示“钦定选(i)个,其余随意”。

    min-max容斥

    [max(S)=sum_{Tsubseteq S}(-1)^{|T|-1}min(T) \ min(S)=sum_{Tsubseteq S}(-1)^{|T|-1}max(T) ]

    证明

    假设(x)是第(k)大元素,定义映射(f:x ightarrow {1,2,dots,k})
    易得(x,k,f(x))一一对应。
    (f(min(x,y))=f(x)cap f(y),f(max(x,y))=f(x)cup f(y))
    然后

    [|f(max(S))|=|igcup_{xin S}f(x)|=sum_{Tsubseteq S}(-1)^{|T|-1}|igcap_{xin T} f(x)|=sum_{Tsubseteq S}(-1)^{|T|-1}|f(min(T))| ]

    [|max(S)|=|igcup_{xin S}x|=sum_{Tsubseteq S}(-1)^{|T|-1}|igcap_{xin T} x|=sum_{Tsubseteq S}(-1)^{|T|-1}|min(T)| ]

    上述式子在期望意义下也是成立的。

    kth min-max容斥

    [max_k(S)=sum_{tsubseteq S} (-1)^{|T|-k} inom{|T|-1}{k-1} min(T) ]

    证明
    (max_k(S)=sum_{tsubseteq S} f(|T|) min(T))
    考虑构造容斥系数(f(x))
    考虑第(x+1)大的元素被统计到的贡献,为(sum_{i=0}^x inom{x}{i} f(i+1))

    [[x+1=k]=sum_{i=0}^x inom{x}{i} f(i+1) ]

    二项式反演,得

    [f(x+1)=sum_{i=0}^x (-1)^{x-i} inom{x}{i} [x=k-1] \ f(x)=(-1)^{x-k}inom{x-1}{k-1} ]

    卡特兰数

    一个序列有n个0和n个1,保证每个1之前必有1个0的方案数为C(n)
    递推式:(注意:括号里只有一个元素的是Catalan数,有两个元素的是组合数)

    [C(n)=C(0)*C(n-1)+C(1)*C(n-2)+...+C(n-1)*C(0) \ C(n)=C(n-1)*(4*n-2)/(n+1) \ C(n)=C(2n,n)/(n+1) \ C(n)=C(2n,n)-C(2n,n-1) ]

    前几项是 1 2 5 14 42 132 429 1430 4862 16796 ,混着眼熟

    斯特林数

    第一类斯特林数

    (n)个元素摆成(m)个圆排列的方案数,记为$$s(n,m)$$
    递推式:

    [s(n,m)=s(n-1,m-1)+(n-1)*s(n-1,m) ]

    常见应用

    [n!=sum_{i=0}^n stra{n}{i} \ x^{underline n}=sum_{i=0}^n stra{n}{i} (-1)^{n-i} x^i ]

    第二类斯特林数

    (n)不同的球放在(m)个相同的盒子(无空盒)里的方案数,记为$$S(n,m)$$
    递推式:

    [S(n,m)=S(n-1,m-1)+m*S(n-1,m) \ S(n,m)=frac{1}{m!}sum_{k=0}^{m}(-1)^kinom m k (m-k)^n=sum_{k=0}^m (-1)^kfrac{(m-k)^n}{k!(m-k)!} ]

    常见应用

    [x^n=sum_{i=0}^n strb{n}{i} x^{underline i} \ m!strb{n}{m} = sum_{k=0}^m inom{m}{k} k^n (-1)^{m-k} ]

    斯特林反演

    [egin {eqnarray*} sum_{k=1}^n stra nk strb km (-1)^{n-k} &=& [m=n] \ sum_{k=1}^n strb nk stra km (-1)^{n-k} &=& [m=n] \ Downarrow \ f(n) = sum_{i=0}^n strb ni g(i) &Longrightarrow& g(n) = sum_{i=0}^n (-1) ^{n-i }stra ni f(i)\ f(n) = sum_{i=0}^n (-1)^{n-i} strb ni g(i) &Longrightarrow & g(n) = sum_{i=0}^n stra ni f(i) \ f(n) = sum_{i=0}^n stra ni g(i) &Longrightarrow & g(n) = sum_{i=0}^n (-1)^{n-i}strb ni f(i)\ f(n) = sum_{i=0}^n (-1)^{n-i}stra ni g(i) &Longrightarrow & g(n) = sum_{i=0}^n strb ni f(i) end{eqnarray*} ]

    错位排列

    递推式:$$f[n]=(n-1)*(f[n-1]+f[n-2])$$

    (n) 很大时, (f[n] approx frac{n!}{e})

    证明:

    1. (n-1) 个人已经完成错排,第 (n) 个人和任意一个人交换
    2. (n-1) 个人中的一个和第 (n) 个人交换,其余 (n-2) 个人已经完成错排

    经典的放球问题

    为方便表达,我们设方案数为(N)(n)个球,(m)个盒

    1. 球不同,盒不同,有空盒

    [N=m^n ]

    根据乘法原理可得。

    2. 球不同,盒不同,无空盒

    (1) (n>=m)

    [N=m!*S(n,m) ]

    球不同,盒相同的方案数( imes m!)

    (2) (n<m)

    [N=0 ]

    3. 球不同,盒同,有空盒

    [N=S(n,1)+S(n,2)+...+S(n,m) ]

    因为允许空盒,所以球可以只放在(m)个盒中的(1)个或(2)个或...或(m-1)个盒中

    4. 球不同,盒同,无空盒

    (1) (n>=m)

    [N=S(n,m) ]

    由第二类斯特林数的定义。

    (2) (n<m)

    [N=0 ]

    5. 球同,盒不同,有空盒

    [N=C(m+n-1,n) ]

    插板法,即把(n)个球用(m-1)个隔板分成(m)部分。

    6. 球同,盒不同,无空盒

    (1) (n>=m)

    [N=C(n-1,m-1) ]

    先在每个盒子里放一个球,方案数为(1);再对剩下的(n-m)个球用隔板法,即把(n-m)个球用(m-1)个隔板分成(m)部分。

    (2) (n<m)

    [N=0 ]

    7. 球同,盒同,有空盒

    (1) (n>=m)

    我们发现,当(n=5,m=3)时的方案为:

    5 0 0

    4 1 0

    3 2 0

    3 1 1

    2 2 1

    (5)种方案。

    我们发现,问题可以转化为:把正整数(n)分解成不超过(m)个自然数的方案数。如果暴力dfs,时间复杂度为(O()爆炸())竟然还有70分

    有一个重要结论:把正整数(n)分解成不超过(m)个自然数的方案数,等于把正整数(n)分解成若干个(le m)的自然数的方案数。这个定理的证明方法,请自行百度。(我也不会)

    我们考虑使用母函数:对于分解出的每个(le m)的整数(i),我们用多项式表示为$$(xi+x{2i}+...+x^{floor(frac{n}{i})*i})$$

    此处(floor(x))表示(x)向下取整。

    于是,母函数(G(x)):$$G(x)=prod_{i=1}{m}(xi+x{2i}+...+x{floor(frac{n}{i})*i})$$

    求出(x^n)的系数即可。

    (2) (n<m)

    $$color{white}{???}$$

    8. 球同,盒同,无空盒

    (1) (n>=m)

    母函数$$G(x)=prod_{i=1}{m}(xi+x{2i}+...+x{floor(frac{n}{i})*i})$$

    (x^{n-m})的系数。

    (2) (n<m)

    [N=0 ]

    生成函数

    引子

    砝码称重问题

    有1g砝码5个,2g砝码3个,5g砝码2个。相同质量的砝码完全相同。问有多少种能称出15g的方案?

    很容易想到暴力枚举每一种可能的称量方案,但是时间复杂度为(O(n^n))级别,计算机无法承受。于是我们引入母函数的概念。设(G(x))为母函数,对于1g的砝码能称出的不同重量,我们用多项式表示为$$(x1+x2+...+x{15})$$同理,2g砝码能表示为$$(x2+x4+...+x{14})$$5g砝码能表示为$$(x5+x{10}+x^{15})$$
    于是$$G(x)=(x1+x2+...+x{15})(x2+x4+...+x{14})(x5+x{10}+x^{15})$$
    经过化简,求出(x^{15})的系数,即为答案。

    由于只需化简多项式,母函数的时间复杂度仅为(O(n^3)),空间复杂度为(O(n)),得到巨大提升。
    使用fft可以进一步优化。

    OGF

    序列(a)的普通生成函数:(F(x)=sum_{n} a_nx^n)

    基本运算律

    (F(x))(a)的OGF,(G(x))(b)的OGF,则:

    • (F(x)pm G(x))(apm b)的OGF
    • (F(x)G(x))(sum_{i=0}^n a_ib_{n-i})的OGF

    常见封闭形式

    [{1,1,1,dots} ightarrow F(x)=frac{1}{1-x} \ {1,p,p^2,dots} ightarrow F(x)=frac{1}{1-px} \ {1,2,3,dots} ightarrow F(x)=frac{1}{(1-x)^2} \ {inom{n}{i}} ightarrow F(x)=(1+x)^n \ {inom{n+i}{i}} ightarrow F(x)=frac{1}{(1-x)^{n+1}} \ ext{fib}[i] ightarrow F(x)=frac{x}{1-x-x^2} ext{卡特兰数};H_n=sum_{i=0}^{n-1} H_iH_{n-i-1} ightarrow H(x)=frac{2}{1+sqrt{1-4x}} ]

    封闭形式的展开

    斐波那契数列

    [F(x)=frac{x}{1-x-x^2}=frac{A}{1-ax}+frac{B}{1-bx} ]

    通分,解得

    [egin{cases} A=frac{1}{sqrt 5} \ B=-frac{1}{sqrt 5} \ a=frac{1+sqrt 5}{2} \ b=frac{1-sqrt 5}{2} end{cases} ]

    [F(x)=sum_{n} frac{1}{sqrt 5}((frac{1+sqrt 5}{2})^n-(frac{1-sqrt 5}{2})^n)x^n ]

    广义二项式定理

    [inom{n}{k}=frac{n^{underline k}}{k!}(rin mathbb{C},kin mathbb{N}) ]

    卡特兰数

    (H(x)=frac{1-sqrt{1-4x}}{2x})
    (sqrt{1-4x})用广义二项式定理展开,代回原式,得

    [H(x)=sum_{ngeq 0}inom{2n}{n}frac{1}{n+1}x^n ]

    EGF

    序列(a)的指数生成函数:(F(x)=sum_{n} a_nfrac{x^n}{n!})

    基本运算律

    (F(x))(a)的EGF,(G(x))(b)的EGF,则:

    • (F(x)pm G(x))(apm b)的EGF
    • (F(x)G(x))(sum_{i=0}^n inom{n}{i}a_ib_{n-i})的EGF

    泰勒展开

    我们用下式表示(f(x))(x_0)处的泰勒展开式

    [f(x)=sum_{i=0}^n frac{f^{(i)}(x_0)}{n!}+R_n(x) ]

    其中(R_n(x))((x-x_0)^n)的高阶无穷小。

    直观理解

    常见封闭形式

    [{1,1,1,dots} ightarrow F(x)=e^x {1,p,p^2,dots} ightarrow F(x)=e^{px} ]

    排列与圆排列

    长为(n)的排列的EGF:(P(x)=sum_{ngeq 0}frac{n!x^n}{n!}=frac{1}{1-x})
    长为(n)的圆排列的EGF:(Q(x)=sum_{ngeq 0}frac{(n-1)!x^n}{n!}=ln(frac{1}{1-x}))

  • 相关阅读:
    DevOps与:cloud,IaC,Container,Microservices, Serverless
    2020年devops的7个发展趋势
    bash极简教程
    Jenkins pipeline jenkinsfile的两种写作方式声明式和脚本式
    Jenkins pipeline之声明式的jenkinsfile
    Linux基本开发环境配置git,c++,nodejs,nginx
    Linux centos8 VPS基本配置之SSH
    DevOps常用工具网址
    DevOps技能自查表
    DevOps的工作岗位的要求
  • 原文地址:https://www.cnblogs.com/BlogOfchc1234567890/p/11694668.html
Copyright © 2011-2022 走看看