数学基础——基本计数方法

计数方法最基础的两个原理是:加法原理和乘法原理。

容斥原理:

假设一个班里有10个学生喜欢数学,15个学生喜欢语文,21个学生喜欢编程。那么班级总人数:

|A∪B∪C| = |A| + |B| + |C| - |A∩B| - |A∩C| - |B∩C| + |A∩B∩C|

一般的,任意多个集合,集合内的元素个数为奇数,前面的符号为正。

问题1:排列问题

n个不同的数,选k个排成1排,有多少种排法。

答案计做p(n,k) = n*(n-1)*(n-2)*...*(n-(k-1)) = n!/(n-k)!

问题2:组合问题

有n个不同的数,选出k个(顺序无关),有多少种选法。

答案计做C(n,k),则有P(n,k) = C(n,k)*P(k,k);

即:C(n,k) = n!/k!*(n-k)!

性质:

1,C(n,0) = C(n,n) = 1;

2,C(n,k) = C(n,n-k);

问题3:二项式定理

求(a+b)n的各项系数。

由定理可知 C(n,k)an-kbk  (k由0→n)

性质4:

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

由此可以计算组合数在O(n)的时间内。

或者根据第一个数要不要,也可以在O(n)递推:http://www.cnblogs.com/TreeDream/p/5346542.html

 1 #include <bits/stdc++.h>
 2
 3 using namespace std;
 4
 5 const int maxn = 100;
 6
 7 int c[maxn][maxn];
 8
 9 int main()
10 {
11     for(int k=1;k<=10;k++) {
12         c[k][0] = 1;
13         for(int i=1;i<=k;i++)
14             c[k][i] = c[k][i-1]*(k+1-i)/i;
15     }
16
17     for(int i=0;i<=9;i++)
18         printf("%d\n",c[9][i]);
19
20     return 0;
21 }

问题4:有重复元素的全排列

有k个元素,第i个元素有ni个,全排列的方案数:

可以先将所有元素标记,答案计做 x

那么: n! = n1!*n2!*...nk! *x

问题5:可重复选择的组合

有n个不同元素,每个元素可以选多次,一共选k个。有多少种选法。

例:n = 3,k=2,(1,1)(1,2)(1,3)(2,2)(2,3) (3,3)

第i个元素选xi个,则:


X1 + X +... + Xn = k

令yi = xi+1;

就有Y1 + Y+... + Y = k + n;

就是k+n个 “1” ,从k+n-1根分割线中挑出n-1个→C(n+k-1,n-1)

问题6:单色三角形

n个点没有三点共线的情况,只有红色和黑色的线连接两点,求单色三角形的个数。

反着来:求异色三角形。

每个点,他有ai 条红边,n-1-ai条黑线。那么这就是一个异色三角形,这个点的异色三角形ai(n-1-ai)

总共就是1/2*∑ai(n-1-ai)

时间: 2024-10-18 08:01:01

数学基础——基本计数方法的相关文章

学习总结--数学.基本计数方法

学习总结--数学.基本计数方法 一.计数方法的原理 1.加法原理:做一件事情有n中办法,第i种办法有pi种执行方案,那么总的解决这件事情的方案数即为p1+p2+p3+...+pn. 2.乘法原理:做一件事情分为n个步骤,第i个步骤的执行方案有pi种,则一共有p1?p2?p3?...?pn种方案解决该问题. 3.容斥原理:一个班级有,集合A的人喜欢数学,集合B的人喜欢英语,结合C的人喜欢语文,那么该班级的人数应该是多少? 如果我们将三个集合的人数相加起来,那么就重复计算了既喜欢数学又喜欢英语的.既

【组合数学】 05 - 经典计数方法

1. 基本计数的母函数 现在来用母函数来求解基本计数问题,母函数既可以完成自动计数,还能表示计数本身,像Stirling数这种就只能用母函数表示.自动计数适用于可以分步的计数问题,并且目标值是每步值之和,这与多项式的运算性质有关. 1.1 组合数和分划数 直观上最符合这一特点的就是模型2,从\(n\)个可区别对象中选出\(m个\).限制第\(k\)个对象被取的次数在集合\(M_k\)中,它被选情况的母函数是\(\sum\limits_{i\in M_k}x^i\),所有元素被选择的情况可以借助母

算法竞赛入门经典行训练指南【计数方法】------2015年1月23日

基础知识整理: (1)加法原理 (2)乘法原理 (3)容斥原理(注意变式问题) (4)排列组合公式的应用及变形: 排列的公式: 其变形为: 与组合的关系如下(以下第一个公式很重要): 排列组合公式的重要推论: 推论1: 对于第一个物体如果不取的话,那么我们有C(n,k+1)种方法,对于第一个物体取的话,我有C(n,k)种方法.公式得证. 推论2: 这可以降低求解二项式系数的时间复杂度,通过利用递推关系自小到大依次计算得出,方便快捷. (5)排列组合的基本问题: Q1:求有重复元素的排列. 有k个

php导出excel长数字串显示为科学计数方法与最终解决方法

1.设置单元格为文本 $objPHPExcel = new PHPExcel(); $objPHPExcel->setActiveSheetIndex(0); $objPHPExcel->getActiveSheet()->setTitle('Simple');//设置A3单元格为文本 $objPHPExcel->getActiveSheet()->getStyle('A3')->getNumberFormat()->setFormatCode(PHPExcel_

算法竞赛训练指南2.1 计数方法

1. O(n)方法求C(n,m) 利用公式C(n,k+1)=C(n,k)*(n-k)/(k+1) 模板: #include <iostream> #include <algorithm> using namespace std; typedef unsigned long long LL; const int maxn=100005; LL n,m; LL C() { if(m==0||n==m) return 1; if(m>n-m) m=n-m; LL ans,temp=

计数方法,博弈论(扫描线,树形SG):HDU 5299 Circles Game

There are n circles on a infinitely large table.With every two circle, either one contains another or isolates from the other.They are never crossed nor tangent.Alice and Bob are playing a game concerning these circles.They take turn to play,Alice go

计数方法(扫描线):JLOI 2016 圆的异或并

Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个圆内则不考虑. Input 第一行包含一个正整数N,代表圆的个数.接下来N行,每行3个非负整数x,y,r,表示一个圆心在(x,y),半径为r的 圆.保证|x|,|y|,≤10^8,r>0,N<=200000 Output 仅一行一个整数,表示所有圆的异或面积并除以圆周率Pi的结果. Sample

【基本计数方法---加法原理和乘法原理】UVa 11538 - Chess Queen

题目链接 题意:给出m行n列的棋盘,当两皇后在同行同列或同对角线上时可以互相攻击,问共有多少种攻击方式. 分析:首先可以利用加法原理分情况讨论:①两皇后在同一行:②两皇后在同一列:③两皇后在同一对角线( / 或 \ ): 其次利用乘法原理分别讨论: ①同一行时(A),先选某一行某一列放置其中一个皇后,共m*n种情况:其次在选出的这一行里的其他n-1个位置中选一个放另一个皇后:共m*n*(n-1)种情况: ②同一列时(B)情况相同,为n*m*(m-1)种情况: ③同一对角线(D)上时,先讨论 /

UVA计数方法练习[3]

UVA - 11538 Chess Queen 题意:n*m放置两个互相攻击的后的方案数 分开讨论行 列 两条对角线 一个求和式 可以化简后计算 // // main.cpp // uva11538 // // Created by Candy on 24/10/2016. // Copyright © 2016 Candy. All rights reserved. // #include <iostream> #include <cstdio> #include <cst