组合数学中杨辉三角与二项式定理以及代码实现

在这里插入图片描述
首先给出杨辉三角(也叫帕斯卡三角形数阵,但我们中国比他早300年)如上图,可以发现三角两边都是1,而中间的数都是上面两个数的和,满足dp[i][j]=dp[i-1][j]+dp[i-1][j-1]这样的递推关系。
然后再来看 ( a + b ) n (a+b)^{n} ,将它展开会得到:
( a + b ) 0 = 1 (a+b)^{0}=1
( a + b ) 1 = a + b (a+b)^{1}=a+b
( a + b ) 2 = a 2 + 2 a b + b 2 (a+b)^{2}=a^{2}+2ab+b^{2}
( a + b ) 3 = a 3 + 3 a 2 b + 3 a b 2 + b 3 (a+b)^{3}=a^{3}+3a^{2}b^{}+3a^{}b^{2}+b^{3}
可以发现每项前面的系数和杨辉三角中的数字很吻合。我们再来看二项式定理:
( a + b ) n = k = 0 n C n k a n k b k (a+b)^{n}=\sum_{k=0}^{n} C^{k}_{n}a^{n-k}b^{k}\qquad
那么二项式定理表示的是什么意义呢,首先这相当于n个(a+b)相乘,那么在每个括号里肯定要选出a或者b来和另外几个括号中的a或者b来相乘,那么有多少种情况呢,我们假设在这n个括号中选择了k个b,那么剩下的就是n-k个a了,情况总数是 C n k C^{k}_{n} 或者 C n n k C^{n-k}_{n} 根据组合数的性质,这两个数是相等的。
然后我们就可以证明下面这个等式:
C n m = C n 1 m 1 + C n 1 m C^{m}_{n}=C^{m-1}_{n-1}+C^{m}_{n-1}
这个可以这么理解一下:
在n件物品中选出m件物品有多少种可能性?
答案是:从n-1件中选出m-1件的可能性+从n-1件中选出m件的可能性。(第m件物品可选可不选)
这和上面杨辉三角形有非常密切的联系,和其所满足的递推式也异常相似。(证明好长,明白就好了。。)
通过这个等式我们可以推出所有的组合数。

for(int i=1;i<=1000;i++)
    {
        c[i][0]=1;c[i][i]=1;
        for(int j=1;j<i;j++)
            c[i][j]=c[i-1][j]+c[i-1][j-1];
    }

很明显时间复杂度 O ( n 2 ) O(n^{2})
但还有一个可以求非常小范围组合数的等式:
C n k = n k + 1 k C n k 1 C^{k}_{n}=\frac{n-k+1}{k}C^{k-1}_{n}
下面是证明过程:
C n k = n ! k ! ( n k ) ! C^{k}_{n}=\frac{n!}{k!(n-k)!}
= n ( n 1 ) ( n 2 ) . . . . ( n k + 1 ) k ( k 1 ) ! =\frac{n(n-1)(n-2)....(n-k+1)}{k(k-1)!}
= n k + 1 k n ! ( k 1 ) ! ( n k + 1 ) ! ( ( n k + 1 ) ! ) =\frac{n-k+1}{k}\frac{n!}{(k-1)!(n-k+1)!}(上下同乘(n-k+1)!)
= n k + 1 k C n k 1 =\frac{n-k+1}{k}C^{k-1}_{n}

int n;
    cin>>n;
    c[0]=1;
    for(int i=1;i<=n;i++) c[i]=c[i-1]*(n-i+1)/i;\\先乘后除
发布了59 篇原创文章 · 获赞 58 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/amazingee/article/details/105009265