zoukankan      html  css  js  c++  java
  • 斐波那契和排列组合性质

    斐波那契

    1. (f_1+f_2+dots+f_n=f_{n+2}−1)
    2. (f_1^2+f_2^2+dots+f_n^2=f_{n}⋅f_{n+1})
    3. (f_1+f_3+f_5+dots+f_{2n−1}=f2n)
    4. (f_2+f_4+f_6+dots+f_{2n}=f_{2n+1}−1)

    前4个性质都很简单,只要利用递推公式就可以证明

    1. (f_{n+m}=f_nf_{m+1}+f_mf_{n−1})

    2. (f_{n−1}f_{n+1}=f_{2n}+(−1)^n)

    性质5可以对(f_n)用递推式不断代换,再换元即可得到
    性质6可以用通项公式证明

    1. (gcd(f_n,f_m)=f_{gcd(n,m)})

    这个可以结合性质5,以及(gcd(n,m)=gcd(n−m,m))证明
    但是要注意特殊情况(f1=f2=1)

    1. (n|m⇔fn|fm)

    这个由性质7稍微变换一下就得到了

    排列组合

    排列

    全排列:(P(n,n)=n!)

    n个人都排队。第一个位置可以选n个,第二位置可以选n-1个,以此类推得: (P(n,n)=n imes(n-1) imesdots imes 2 imes 1=n!)

    部分排列:(P(n,m)=frac{n!}{(n-m)!})

    n个人,选m个出来排队,第一个位置可以选n个,…,最后一个可以选n-m+1个,以此类推得:P(n,m)=n(n-1)...*(n-m+1)=n!/(n-m)!

    组合

    n个人,选m个人出来。

    因为不在乎顺序,所以按排列算的话,每个组合被选到之后还要排列,是被算了m!遍的(C(n,m)*m!=P(n,m))

    故而得:(C(n,m)=frac{n!}{m! imes(n-m)!})

    有两条性质:

    1. (C(n,m)=C(n,n-m))就是说 从n个里面选m个 跟 从n个里面选n-m个出来不选它 是一样的。

    2. (C(n,m)=C(n-1,m)+C(n-1,m-1))递推式

    从n个里面选m个出来的方案 = 从n-1个里面选m个的方案(即不选第n个) + 从n-1个里面选m-1个的方案(即选第n个)

    圆排列

    圆排列:(Q(n,n)=(n-1)!)

    n个人坐成一圈有多少种坐法。

    坐成一圈后,分别以每个位置为头断开,可以排成一个序列,就是将n个人全排列中的一种。这样可以得到n个序列,但是在圆排中是视为同一种坐法的。所以:
    (Q(n,n)*n=P(n,n),即Q(n,n)=P(n,n)/n=n!/n=(n-1)!)

    部分圆排:(Q(n,m)=frac{P(n,m)}{m}=frac{n!}{m*(n-m)!})

    重复排列(有限个)

    [frac{n!}{a_1! imes a2! imesdots imes a_k!} ]

    k种不一样的球,每种球的个数分别是a1,a2,...ak,设n=a1+a2+…+ak,求这n个球的全排列数。

    把每种球重复的除掉就好了。假如第一种球有a1个,那么看成都是不一样的话就有a1!种排列方法,然而它们都是一样的,就是说重复了a1!次。其它的一样,所以重复排列的公式就是n!/(a1!a2!…*ak!)

    重复组合(无限个)

    [C(n+k-1,k) ]

    n种不一样的球,每种球的个数是无限的,从中选k个出来的方案数。

    证明1:

    给这n个球编号为1~n,选出来k个。

    设为(1≤a_1≤a_2≤a_3≤dots≤a_k≤n),因为是组合,排下序也没什么关系。

    可能重复,所以有等号。但是普通的组合是没有等号的,所以要把等号想办法去掉。

    于是设(b_i=a_i+i-1)。这样就保证了{b}都是不一样的。

    故得(1<b_1<b_2<dots <b_k<n+k-1)

    即相当于从n+k-1个球中选k个出来,为C(n+k-1,k).

    证明2:转化为隔板法

    选出来了k个球,我们就设本来就有n+k个,而这n+k个球只有n种不同的种类,就=把这n+k个球
    分进不同的n个盒子里,但保证每个盒子不为空=把n+k个数分成不为空的n块=在n+k-1个间隔中
    放n-1个隔板(来分)。即C(n+k-1,n-1)=C(n+k-1,k)

    不相邻组合

    [C(n-k+1,k) ]

    1~n这n个自然数中选k个,这k个数中任何两个数不相邻数的组合有多少种。

    可以跟上面证明1的证法一样来证

    一开始先假设选出来的k个数没有取到1和n,那么就相当于把n-k个数分成了k+1份(因为要求要
    不相邻)。但是我们是可以选1和n的,所以给两边各补上一位(随便补啦,按顺序的话就是0跟
    n+1咯),这样选出来的k个数都在1~n中,就相当于把n-k+2个数分成了k+1份。即在(n-k+2)-1
    个间隔中放k个隔板!就是C(n-k+1,k)

    错排(错位排列)

    [d(n)=(n-1)*(d(n-1) + d(n-2),n≥3 ]

    同时也有(d(n)=n*d(n-1) + (-1)^n)。没深入探讨和背过这个orz

    问题相当于,有n个人编号为1n,住在1n号房间,要求每个人的编号与其房间号不同,问有多少种排列方法。

    于是这个怎么推导的呢?先写成:(d(n)=(n-1) imes d(n)-1 + (n-1) imes d(n)-2)

    假如说一开始第i个人住在第i号房间。

    ①令n-1个人错排后,第n个人与其中的一个i互换房间,即n住在i错排后住的房间,i去住第n号房间。满足要求啊。因为n可以和n-1个人换房间,所以有(n-1)*dn-1种方法。

    ②n选择跟一个人换房间,即n住第i号房,i住第n号房,让剩下的n-2个人自己去搞一次错排。同样的,n可以有n-1种选择,这就有(n-1)*dn-2种方法。跟上一种方式是不一样的哦!

    故递推关系就是dn=(n-1)*(dn-1 + dn-2)

    错位排列数列为(0,1,2,9,44,265dots)

    stirling数(斯特林数)

    第一类stirling数:

    [S(n,m)=S(n-1,m-1)+(n-1) imes S(n-1,m) ]

    n个不同元素构成m个圆排列

    1. n-1个元素构成了m-1个圆排,第n个单独成一个圆排:S(n-1,m-1)。

    2. n-1个元素构成m个圆排,将第n个元素插在任一个元素的左边:(n-1)*S(n-1,m)。

    故递推关系就是S(n,m)=S(n-1,m-1)+(n-1)*S(n-1,m)。

    第二类stirling数:

    [S(n,m)=S(n-1,m-1)+m imes S(n-1,m) ]

    n个不同元素构成m个非空的(无差别)集合

    ①n-1个元素构成了m-1个集合,第n个单独成一个集合:S(n-1,m-1)。

    ②n-1个元素构成m个集合,第n个放进任一个集合里:m*S(n-1,m)。

    故递推关系就是S(n,m)=S(n-1,m-1)+m*S(n-1,m)。

    有些性质啊S(n,0)、S(n,1)、S(n,n)等等为一些常数的,可以自己想到的!

  • 相关阅读:
    Java第三季
    LeetCode(10)Regular Expression Matching
    LeetCode(9)Palindrome Number
    shell基础编程
    LeetCode(8)String to Integer (atoi)
    使用python绘制词云
    我的书单
    LeetCode(7)Reverse Integer
    获取新浪微博的Access_token
    c语言中,常见数据类型的字节数
  • 原文地址:https://www.cnblogs.com/foursmonth/p/14161840.html
Copyright © 2011-2022 走看看