标签:内容 scanf 文章 while printf 了解 方案 style clu
组合数学的意义广泛,但是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
看到这里大家一定对排列组合有了一些基本了解了,辣么我们来做一些可爱的小练习吧!!
有一张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\n",ans); } return 0; }
标签:内容 scanf 文章 while printf 了解 方案 style clu
原文地址:https://www.cnblogs.com/valentino/p/11657101.html