组合数学入门

Posted valentino

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了组合数学入门相关的知识,希望对你有一定的参考价值。

组合数学的意义广泛,但是OI联赛中常用的是排列组合,所以我就先写一点排列组合的知识,联赛后补上更多的内容,在此之前不了解排列组合基本知识的同学建议移步信息学奥赛一本通初赛篇,讲得很好。本文章虽然也是入门,但我懒得写详细介绍,所以直接开始讲基础知识啦。

由于博客园的LaTeX很不方便,我就不写LaTeX了。

组合的表示:C(n,m)表示从n个数当中选m个出来的方案数。

排列的表示:A(n,m)表示从n个数中找出m种排列。

排列组合的基本性质

1.C(n,m)=C(n-1,m)+C(n-1,m-1)

2.C(n,m)=n!/(m!*(n-m)!)

3.A(n,m)=n!/(n-m)!

4.∑ni=0C(n,i)=2n

5.二项式定理:(x+y)n=∑ 0<=k<=n C(n,k)xkyn-k

看到这里大家一定对排列组合有了一些基本了解了,辣么我们来做一些可爱的小练习吧!!

排列组合入门经典例题

例1 POJ1942 Paths On A Grid

有一张n*m的网格纸,求从左下到右上的方案数,每次只能向上或向右走。

分析:如果我们要从左下走到右上,那么一共就会走n+m步,而这n+m步当中我们有n步是在往上走的,由于每一步向右或者向上走都会计算成不同的方案,所以n+m中可以选不同的位置来走这n步,所以最后的方案就是C(n+m,n),可能有同学会问,为啥不是n+m选m个呢?其实你把它代入公式后就会发现,结果是一样的2333..答案绝对不是C(n+m,n)+C(n+m,m),因为你在选择一种n步的时候那么另外m步就确定了,相加就重复了。

代码:

#include<cstdio>
#define min(x,y) ((x)<(y))?(x):(y)
unsigned long long n,m;
int main()
{
    while(~scanf("%llu%llu",&n,&m))
    { 
    if(!n&&!m)break;
    unsigned long long sum=n+m;
    n=min(n,m);
    unsigned long long ans=1;
    for(int i=1;i<=n;i++)
    ans*=(sum-i+1),ans/=i;
    printf("%llu
",ans);    
    }    
    return 0;
} 

 

以上是关于组合数学入门的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 代码片段

如何组合绑定片段而不将它们包装在 XML 文字中

48个值得掌握的JavaScript代码片段(上)

Cg入门6:函数2

Atom编辑器入门到精通 Atom使用进阶

Cg入门20:Fragment shader - 片段级模型动态变色(实现汽车动态换漆)