组合数学之一 —— 计数问题基础

排列和组合是最基本的计数技巧。

基础知识

加法原理:
做一件事有n种方法,第i种方法有pi种方案,则一共有p1+p2+…+pn种方案
互不影响的事件之间通常使用加法原理

乘法原理:
做一件事有n个步骤,第i个步骤有pi种方案,则一共有p1p2…*pn种方案,

乘法原理是加法原理的特殊情况。二者都可以用于递推。

注意:

使用加法原理的关键是分类:各类别之间必须不重不漏
如果有重复,我们可以使用容斥原理

容斥原理:
简单来说:|A∪B∪C|=|A|+|B|+|C|-|A∩B|-|B∩C|-|A∩C|+|A∩B∩C|
其中左边是所有集合的∪,右边是集合的各种搭配,每个搭配都是若干集合的交集
且每一项前面的正负号取决于集合的个数——奇数个数为+,偶数个数为-

这是很重要的一个公式

注意:

如果我们现在要求100以内能被4,5,6整除的数字的个数
根据公式得到:
ans=(100以内能被4整除的数字)+(能被5整除的数字)+(6整除的数字)
-(能被20整除的数字)-(能被30整除的数字)-(能被12整除的数字)
+(能被60整除的数字)

杨辉三角与二项式定理

组合数C(n,m)在组合数学中占据着重要的位置,
与组合学相关的两个最重要的两个内容就是杨辉三角和二项式定理

首先我们先说说组合数C
(一下我们讨论的都是从n个中选m个的组合)

公式: C(n,m)=n!/(m!*(n-m)!)

ta的重要性质如下:

  • C(n,0)=C(n,n)=1
  • C(n,m)=C(n,n-m)
  • C(n,k)+C(n,k+1)=C(n+1,k+1)
  • C(n,k+1)=C(n,k)*(n-k)/(k+1)

下图就是杨辉三角啦:
组合数学之一 —— 计数问题基础_第1张图片

另一方面,我们把(a+b)^n展开:
(a+b)^0 = 1
(a+b)^1 = a + b
(a+b)^2 = a^2 + 2 * a * b+b^2
(a+b)^3 = a^3 + 3 * a^2 * b + 3 * a * b^2 + b^3
(a+b)^4 = a^4 + 4 * a^3 * b+6 * a^2 * b^2 + 4 * a * b^3 + b^4

系数正好和杨辉三角一致
一般的,有二项式定理:
这里写图片描述

给定n,我们要怎么求出a和b的所有项的系数呢
一个方法是递推,运用杨辉三角中发现的规律:

memset(C,0,sizeof(C));
C[1][0]=1; C[1][1]=1;
for (int i=2;i<=n;i++)
{
	C[i][0]=1; C[i][i]=1;
	for (int j=2;j

然而这个算法是n^2的,非常不优秀
另一个方法是利用公式:
C(n,k)=C(n,k-1)*(n-k+1)/k
从C(n,0)=1开始从左向右推

C[0]=1;
for (int i=1;i<=n;i++)
    C[i]=C[i-1]*(n-i+1)/i;

注意:先乘后除,谨防溢出

数论中的计数问题

约数的个数

给出正整数n的唯一分解式,求n的正约数的个数

实际上这就是数论基本函数d
n=p1^a1 * p2^a2 * p3^a3 * … * pn^an
不难看出,n的任意正约数也只能包含这些素因子
对于n的每个素因子pi,ta在约数中的次数应该是是在0~ai这个范围内的,一共有ai+1种选择
不同的素因子之间相互独立,根据乘法原理:
这里写图片描述

小于n且与n互素的整数个数

当然,学过数论的人一眼就秒:phi函数
这里写图片描述
这次我们要试图弄懂ta是怎么来的:

用容斥原理,首先从总数n中分别减去是p1,p2 , p3 … 的倍数
即:n-n/p1-n/p2-n/p3-…
然后加上同时是两个素因子倍数的个数:
n/(p1p2)+n/(p2p3)+n/(p3p4)+…
再减去同时是三个素因子倍数的个数… …
以此类推,最后得到的就是一个“学术味比较浓厚的柿子”:
这里写图片描述
经过化简就可以得到:
这里写图片描述

你可能感兴趣的:(知识储备,组合数学,知识储备)