zoukankan      html  css  js  c++  java
  • 信息学中的组合数学

    信息学中的组合数学

    本文为对于唐文斌的《信息学中的组合数学》的一个总结。

    基础知识

    排列与组合

    组合数:从(N)个元素中选取(M)个元素,选取顺序无关,记做(C(N, M))
    (C(N, M)=frac{N!}{M!(N-M)!}=C(N-1, M-1)+C(N-1, M))

    排列数:从(N)个元素中选取(M)个元素,选取顺序有关,记做(P(N, M))
    (P(N, M)=frac{N!}{(N-M)!})

    容斥原理

    设有(n)条件(A),满足至少一个条件的答案
    (|A_1 cup A_2 cup ... cup A_n|=(|A_1|+|A_2|+...+|A_n|)-(|A_1 cap A_2|+|A_1 cap A_2|+...+|A_1 cap A_n|+...+|A_{n-1} cap A_n|)+...+(-1)^{n-1}|A_1 cap A_2 cap ... cap A_n|)

    欧拉函数

    欧拉函数(varphi(n))是小于(n)且与(n)互质的数的个数.
    (p_i)(n)的质因子,(n)共有(k)个质因子,则

    [n=prod_{i=1}^{k} p_i^{a_i} ]

    [varphi(n)=n-(frac{n}{p_1}+frac{n}{p_2}+...+frac{n}{p_k})+(frac{n}{p_1p_2}+frac{n}{p_1p_3}+...frac{n}{p_{n-1}p_n})+...+(-1)^k frac{n}{p_1p_2...p_k} ]

    [=nprod_{i=1}^{k}(1-frac{1}{p_i}) ]

    给定一个集合(G)和二元运算(“·”),满足:
    封闭性:若(a,b in G),则(a·b in G)
    结合律:((a·b)·c=a·(b·c))
    存在单位元(e:a·e=e·a=a)
    存在逆元素:(b=a-1,a·b=b·a=e)
    那么就称集合(G)在运算(“·”)下是一个群。

    置换群

    由置换组成的群。
    一个置换就是一个n元集合到其自身的一一映射。例如

    [egin{pmatrix} 1, 2, 3\ 3, 1, 2 end{pmatrix} ]

    Burnside引理

    (G)(N=){(1,2,3,…,n)}上的置换群,(G)(N)上可引出不同的等价类,其不同的等价类个数

    [l=frac{1}{|G|}|c_1(a_1)+c_1(a_2)+…+c_1(a_g)| ]

    其中(c_1(a_k))表示在置换(a_k)作用下保持不变的元素的个数。

    Pólya定理

    (m)着色,在某个置换(P)下, 不动点个数:(m^{c(P)}),(c(P))为置换(P)的循环个数.

    不相邻的组合

    题目描述:给定(N)个球排成一行, 取(M)个不相邻的球的方案个数。

    solution
    这道题的DP方法比较简单,所以这里就不讨论了。
    假设第(i)个球取得位置是(a_i),那么(a_i+1<a_{i+1}),设(b_i=a_i-(i-1))(然而我并不知道这个是怎样想出来的),那么(b_i<b_{i+1}),所以答案就是(C(n-(m-1), m)).

    扩展(n)个球围成环。
    只要把第一个数是否选择进行分类即可。

    逆序对排列数

    题目描述:包含(K)个逆序对的长度为(N)的排列个数。

    solution
    DP, 设(f[i][j])为决策到数字(i),有(j)个逆序对的排列数。

    [f[i][j]=sum_{p=0}^{min(i-1, K)} f[i-1][j-p] ]

    加个部分和就可以变成(O(n^2)).

    堆的种类

    题目描述:将(1…n)按任意顺序插入堆中,求不同的堆的个数,输出方案数模(m)

    solution
    (f[i])为堆的元素的个数,枚举左儿子的个数(j)

    [f[i]=sum_{j=0}^{i-1} C(i-1, j)*f[j]*f[i-1-j] ]

    Permutation Counting

    题目描述:求满足有(k)个位置(a_i>i)(n)排列个数

    solution
    假设一个排列(a),(i)(a_i)连边,题目的条件就是向后连的边。设(f[i][j])表示长度为(i)的排列,有(j)个位置满足条件,现考虑把(i)插入。
    假设位置(j)(i)的值交换,
    1、位置(j)向后连边。那么交换后(j)依然向后连边,而(i)则是向前连边,所以向后连得边的数量不变。
    2、位置(j)向前或自己连边。那么交换后(j)向后连边,(i)则是向前连边,所以向后连边的数量加一。
    3、数字(i)就放在位置(i),向后连得边的数量不变。

    [f[i][j]=f[i-1][j]*j+f[i-1][j-1]*(i-1-(j-1))+f[i-1][j] ]

    着色方案

    题目描述:有(n)个木块排成一行,现在有(k)种油漆,第(i)种油漆恰好足够给(c_i)个木块染色,且(c_1+c_2+…+c_k=n)。求任意两个相邻的木块不同色的方案数。

    solution
    由于数据比较小, 所以设一个(c+1)维数组,第(i)维表示剩下(i)次的油漆有多少种以及最后用的那种油漆还剩多少。递推式比较难表达,但比较容易想,这里就不写了。

    生成树计数

    题目描述(N)个点成链状,距离不超过(k)的有边相连。求生成树个数。

    solution
    因为(k)最大是(5)(k)个点的连通性用最小表示法表示后只有(52)种状态, 现新加一个点,删掉最前的点,状态转移可以求出。构造状态转移矩阵,用矩阵乘法求解。

    互质求和

    题目描述:求出所有与(n)互质的数的和。

    solution
    (p_i)(n)的质因子,(n)共有(k)个质因子,则

    [n=prod_{i=1}^{k} p_i^{a_i} ]

    [S=frac{(1+n)n}{2}-(frac{(n+p_1)n}{2p_1}+frac{(n+p_2)n}{2p_2}+...+frac{(n+p_k)n}{2p_k})+(frac{(n+p_1p_2)n}{2p_1p_2}+frac{(n+p_1p_3)n}{2p_1p_3}+...frac{(n+p_{n-1}p_n)n}{2p_{n-1}p_n})+...+(-1)^k frac{(n+p_1p_2...p_k)n}{2p_1p_2...p_k} ]

    [=frac{n^2}{2}prod_{i=1}^{k}(1-frac{1}{p_i})+frac{n}{2}(sum_{i=0}^{k}C_n^i) ]

    [=frac{varphi(n)n}{2} ]

    带约束的整数方程

    题目描述:求方程(x_1+x_2+…+x_m=n)的解的个数.满足:
    (L_i≤x_i≤R_i)

    solution
    (y_i=x_i-L_i, n=n-sum_{i=1}^m L_i),则原题变为

    [sum_{i=1}^m y_i=n (y_i<=R_i-L_i) ]

    (f[i][j])为前(i)(y_i)的和为(j)的方案数。DP即可求解。

    Candy

    题目描述:有(n)种糖果,第(i)种糖果有(m_i)个,求吃掉至少(a)个,不超过(b)个糖果的方案数模2004。

    solution
    问题可转化为求吃掉不超过(lim)个糖果的方案数,答案为不超过(b)的方案减去不超过(a-1)的方案。
    假设每种糖果没有上限,那么答案就是(C_{lim+n-1}^{n-1}),由于现在有上限,所以可以尝试用容斥原理,就可以算出全都没有超出的方案数。
    假设超出上限的糖果为(x_i),也就是说这些糖果至少吃了(sum_i (m_{x_i}+1))颗,那么可以用(lim)减去这些糖果,那么现在对于每种糖果都没有上限了,就可以直接用组合数求解。

    COCI 2010R4. Palacinke

    题目描述:有(n)个点(m)条单向边的图,每条边上有BJMP四种东西中的若干样。现在要从节点(1)出发,经过(T)条边之后回到节点(1),满足经过的这些边上BJMP都出现了的方案数模5557。

    solution
    (f[i][j][sett])表示经过(i)条边后到达(j)号点,且BJMP集合为(sett)的方案数。由于(T)比较大,且(f[i])只与(f[i-1])有关,所以考虑构造状态转移矩阵,然后用矩阵乘法求解。时间复杂度是(O((2^4n)^3logT)),还是会超时,所以要压缩一下转移矩阵的大小。
    可以考虑用容斥原理,枚举经过的边上集合要是哪个集合的子集。因为到达终点有BJMP的方案=-经过B子集的边-经过J子集的边-经过M子集的边-经过P子集的边+经过BJ子集的边+...+经过BJMP子集的边。那么只需枚举集合,状态转移矩阵就变成(n*n).时间复杂度变成(O(2^4n^3logT))

    置换开根

    题目描述:给定一个置换(p), 求置换(q)满足: (q^2=p)

    [egin{pmatrix} 1, 2, 3\ 3, 1, 2 end{pmatrix}^2= egin{pmatrix} 1, 2, 3\ 2, 3, 1 end{pmatrix} ]

    solution
    一个置换可以看成很多个环,一个偶环的平方可能是两个偶环,也可能是两个奇环,一个奇环的平方还是一个奇环,根据这个来构造解即可。

    其实对于群,置换之类的知识我也不是很熟悉,也不打算深入了解,所以就在此置笔了。

  • 相关阅读:
    JavaScript的性能优化:加载和执行
    JS获取图片的原始尺寸
    深入理解js构造函数
    Revit二次开发 获取缩略图
    WPF listbox分页
    WPF ListBox 图片显示及分页
    Revit禁用RibbonPanel
    C# excel 单元格居中
    WPF TreeView
    WPF ListView绑定数据
  • 原文地址:https://www.cnblogs.com/GerynOhenz/p/5401890.html
Copyright © 2011-2022 走看看