排列组合与二项式

排列

概念:从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号 A n m A^m_n Anm 表示,有时也写作 A(n, m)。
A n m = n ! ( n − m ) ! A^m_n = \frac{n!}{(n-m)!} Anm=(nm)!n!

= n ∗ ( n − 1 ) ∗ ( n − 2 ) . . . 2 ∗ 1 ( n − m ) ∗ ( n − m − 1 ) ∗ ( n − m − 2 ) . . . 2 ∗ 1 = \frac{n*(n-1)*(n-2)...2*1}{(n-m)*(n-m-1)*(n-m-2)...2*1} =(nm)(nm1)(nm2)...21n(n1)(n2)...21

= n ∗ ( n − 1 ) ∗ ( n − 2 ) . . . ( n − m + 1 ) =n*(n-1)*(n-2)...(n-m+1) =n(n1)(n2)...(nm+1)

全 排 列 : A n n = n ! = n ∗ ( n − 1 ) ∗ ( n − 2 ) ∗ . . . ∗ 1 叫 做 n 的 阶 乘 全排列:A_n^n = n! = n*(n-1)*(n-2)*...*1\quad叫做 n的阶乘 Ann=n!=n(n1)(n2)...1n

另 规 定 : 0 ! = 1 , 因 为 0 本 身 也 是 一 种 情 况 . 另规定:\quad 0! = 1,因为 0本身也是一种情况. :0!=10.


组合

概念:从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号 C n m C_n^m Cnm表示,有时也写作 C(n, m) 。

C n m = A n m A m m = n ! ( n − m ) ! m ! = n ! ( n − m ) ! ∗ m ! C^m_n =\frac{A^m_n}{A_m^m} = \frac{\frac{n!}{(n-m)!}}{m!} = \frac{n!}{(n-m)! * m!} Cnm=AmmAnm=m!(nm)!n!=(nm)!m!n!

= n ∗ ( n − 1 ) ∗ ( n − 2 ) ∗ . . . ∗ ( n − m + 1 ) m ! = \frac{n*(n-1)*(n-2)*...*(n-m+1)}{m!} =m!n(n1)(n2)...(nm+1)

公 式 替 换 : C n m = C n n − m , 其 中 ( n ≥ m ) . 公式替换: \quad C^m_n = C_n^{n-m} ,其中(n\ge m). :Cnm=Cnnm(nm).

另 规 定 : C n 0 = C n n = 1 另规定:C_n^0 = C_n^n = 1 Cn0=Cnn=1

推 导 公 式 : P = A m 1 A n 1 = m ! ( m − 1 ) ! n ! ( n − 1 ) ! = m ! ( n − 1 ) ! ( m − 1 ) ! n ! = m n 推导公式:P = \frac{A^1_m}{A^1_n} = \frac{\frac{m!}{(m-1)!}}{\frac{n!}{(n-1)!}} = \frac{m!(n-1)!}{(m-1)!n!} = \frac{m}{n} P=An1Am1=(n1)!n!(m1)!m!=(m1)!n!m!(n1)!=nm

推 导 公 式 : P = C m 1 C n 1 = A m 1 A 1 1 A n 1 A 1 1 = A m 1 A n 1 = m n 推导公式:P = \frac{C^1_m}{C^1_n} = \frac{\frac{A^1_m}{A^1_1}}{\frac{A^1_n}{A^1_1}} =\frac{A^1_m}{A^1_n} = \frac{m}{n} P=Cn1Cm1=A11An1A11Am1=An1Am1=nm

可以把从n个数中选m个数的组合分为2类

  1. 不含第n个数的组合,方案数为: C n − 1 m C_{n-1}^{m} Cn1m
  2. 含第n个数的组合,方案数为: C n − 1 m − 1 C_{n-1}^{ m-1} Cn1m1

所以 C n m = C n − 1 m − 1 + C n − 1 m − 1 C_n^m = C_{n-1}^{m-1} + C_{n-1}^{m-1} Cnm=Cn1m1+Cn1m1


洛谷问题:P2181 对角线

P2181 对角线题目 洛谷链接

题目描述
对于一个 n 个顶点的凸多边形,它的任何三条对角线都不会交于一点。
请求出图形中对角线交点的个数。

输入格式:输入只有一行一个整数 n,代表边数。
输出格式:输出一行一个整数代表答案。

输入输出样例
输入:3 \quad\quad 输出:0
输入:6 \quad\quad 输出:15

说明/提示
数据规模与约定
对于 50 % 的数据,保证 3 ≤ n ≤ 100 3≤n≤100 3n100
对于 100 % 的数据,保证 3 ≤ n ≤ 1 0 5 3≤n≤10^5 3n105


洛谷问题:P2181 对角线解答

已知:保证任何三条对角线都不会交于一点

推导如下:

  1. 每两个顶点连一条对角线
  2. 每两条对角线有一个顶点
  3. 所以每一个交点对应四个顶点
    则问题转化为:

    从n个顶点之中选出4个,有多少种选法?

由于四个顶点无序,所以是组合问题,那么结果就是: C n 4 C^4_n Cn4

C n 4 = A n 4 A 4 4 = n ! ( n − 4 ) ! 4 ! C^4_n =\frac{A^4_{n}}{A_4^4} =\frac{ \frac{n!}{(n-4)!}} {4!} Cn4=A44An4=4!(n4)!n!

= n ∗ ( n − 1 ) ∗ ( n − 2 ) ∗ ( n − 3 ) 4 ! =\frac{n*(n-1)*(n-2)*(n-3)}{4!} =4!n(n1)(n2)(n3)

程序实现
知道公式了,也就能解决问题了,但是这里出现了高精度问题
因为 n = [ 3 , 1 e 5 ] n = [3,1e5] n=[3,1e5],unsigned long long 对应的最大值为 2 64 − 1 = 1.8 e 19 2^{64}-1 = 1.8e19 2641=1.8e19.

ULLONGMAX =18446744073709551615
交 点 个 数 = n ∗ ( n − 1 ) ∗ ( n − 2 ) ∗ ( n − 3 ) / 4 ! 交点个数 = n*(n-1)*(n-2)*(n-3)/4! =n(n1)(n2)(n3)/4!

1 e 5 ∗ 1 e 5 ∗ 1 e 5 ∗ 1 e 5 = 1 e 20 > p o w ( 2 , 64 ) − 1 1e5 * 1e5 * 1e5 * 1e5 =1e20 > pow(2,64)-1 1e51e51e51e5=1e20>pow(2,64)1

所以需要解决这个问题:
发现规律

n,n-1 中必然有个数能被2 整除
n, n-1, n-2 中必然有个数能被3 整除
n, n-1, n-2, n-3 中必然有个数能被4 整除

所以 交 点 个 数 = n ∗ ( n − 1 ) ∗ ( n − 2 ) ∗ ( n − 3 ) / 4 ! 交点个数 = n*(n-1)*(n-2)*(n-3)/4! =n(n1)(n2)(n3)/4!
可以改写为 交 点 个 数 = n ∗ ( n − 1 ) / 2 ∗ ( n − 2 ) / 3 ∗ ( n − 3 ) / 4 交点个数 = n*(n-1)/2*(n-2)/3*(n-3)/4 =n(n1)/2(n2)/3(n3)/4

#include<iostream>
#include<climits>
#include<cmath>
using namespace std;
unsigned long long n,ans;// 2^64-1 = 18446744073709551615 = 1.84467e+019 
int main(){
	cin>>n;// n = [3,1e5]
	ans = n*(n-1)/2*(n-2)/3*(n-3)/4;
	cout<<ans;
//	cout<<pow(2,64)-1<<endl;//1.84467e+019  
//	cout<<ULLONG_MAX<<endl;//18446744073709551615 
//	1e5 * 1e5 * 1e5 * 1e5 =1e20 > pow(2,64) 
	return 0;
}

那么如果问怎么求对角线条数呢?
容易得出公式:对角线条数 = n ∗ ( n − 3 ) / 2. n*(n-3)/2. n(n3)/2.

n345678n
规律0 4 ∗ 1 2 \frac{4*1}{2} 241 5 ∗ 2 2 \frac{5*2}{2} 252 6 ∗ 3 2 \frac{6*3}{2} 263 7 ∗ 4 2 \frac{7*4}{2} 274 8 ∗ 5 2 \frac{8*5}{2} 285 n ∗ ( n − 3 ) 2 \frac{n*(n-3)}{2} 2n(n3)
对角线条数01591420 n ∗ ( n − 3 ) 2 \frac{n*(n-3)}{2} 2n(n3)

二项式

( a + b ) n = C n 0 a n + C n 1 a n − 1 b + C n 2 a n − 2 b 2 + . . . + C n r a n − r b r + . . . + C n n b n (a+b)^n = C_n^0a^n+C_n^1a^{n-1}b+C_n^2a^{n-2}b^2+...+C_n^ra^{n-r}b^r+...+C_n^nb^n (a+b)n=Cn0an+Cn1an1b+Cn2an2b2+...+Cnranrbr+...+Cnnbn

展开式共n+1项,第r+1项: T r + 1 = C n r a n − r b r ( r = 0 , 1 , 2... n ) T_{r+1} = C_n^ra^{n-r}b^r (r=0,1,2...n) Tr+1=Cnranrbrr=0,1,2...n称为二项式展开式的通项,其中组合数 C n r C_n^r Cnr叫做第(r+1)项的二项式系数。

注意:项的系数和二次项系数是不同的概念,当a=b=1时,系数就是二项式系数.

举例: ( 2 a + b ) n (2a+b)^n (2a+b)n 第r+1项: T r + 1 = C n r ( 2 a ) n − r b r = 2 n − 1 C n r a n − 1 b r T_{r+1}=C_n^r(2a)^{n-r}b^r = 2^{n-1}C_n^ra^{n-1}b^r Tr+1=Cnr(2a)nrbr=2n1Cnran1br,其中 2 n − 1 C n r 2^{n-1}C_n^r 2n1Cnr 叫做第(r+1)项的系数。

当 a=b=1时,容易推导出下列公式:
C n 0 + C n 1 + C n 2 + . . . + C n n − 1 + C n n − 1 + C n n = 2 n C_n^0+C_n^1+C_n^2+...+C_n^{n-1}+C_n^{n-1}+C_n^n = 2^n Cn0+Cn1+Cn2+...+Cnn1+Cnn1+Cnn=2n

C n 0 + C n 2 + C n 4 + . . . = C n 1 + C n 3 + C n 5 + . . . = 2 n − 1 C_n^0+C_n^2+C_n^4+... = C_n^1+C_n^3+C_n^5+... = 2^{n-1} Cn0+Cn2+Cn4+...=Cn1+Cn3+Cn5+...=2n1


【例】 ( x 2 + 1 x 2 ) (x^2+\frac{1}{x^2}) (x2+x21)的二项式展开式中各项展开式的系数和为64,则二项式展开式中常数项为( \quad

2 n = 64 , 所 以 n = 6 2^n=64,所以 n=6 2n=64n=6

T r + 1 = C n r ( x 2 ) 6 − r ( 1 x 2 ) r = 6 ! ( 6 − r ) ! ∗ r ! ∗ x 12 − 4 r T_{r+1} = C_n^r(x^2)^{6-r}(\frac{1}{x^2})^r = \frac{6!}{(6-r)!* r!} * x^{12-4r} Tr+1=Cnr(x2)6r(x21)r=(6r)!r!6!x124r

12 − 4 r = 0 , 所 以 r = 3 12-4r = 0,所以r=3 124r=0r=3

6 ! ( 6 − r ) ! ∗ r ! = 6 ! ( 6 − 3 ) ! ∗ 3 ! = 6 ∗ 5 ∗ 4 3 ∗ 2 ∗ 1 = 20 \frac{6!}{(6-r)!* r!} = \frac{6!}{(6-3)!* 3!} = \frac{6*5*4}{3*2*1} =20 (6r)!r!6!=(63)!3!6!=321654=20

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值