zoukankan      html  css  js  c++  java
  • 集训DAYn——组合数学(1)

    组合

    又到了我们信息教练讲数学课了,吼吼吼

    然后数学教练水能老师中途探望了一下,然后他看到黑板上的题,微妙的笑了.


    排列:

    从n个数中有序的选出m个数的方案数是多少?
    第一个数有n种取法,第二个数有n-1种取法......第m个数有n-m+1种取法。

    n*(n-1)*...*(n-m+1)=n!/(n-m)!记为A(n,m).

    组合:

    从n个数中无序的选出m个数的方案数是多少?

    先有序的取m个数,那么无序的m个数会被取到m!次。

    A(n,m)/m!=n!/[m!(n-m)!]记为C(n,m)

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

    组合数的性质:1.C(m,n)=C(n-m,n)

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

           3.C(0,n)+C(1,n)+C(2,n)+...+C(n,n)=2^n

           4.C(n,n)+C(n,n+1)+C(n,n+2)+...+C(n,n+r)=C(n+1,n+r+1)

           5.C(0,n)+C(2,n)+C(4,n)+...=C(1,n)+C(3,n)+C(5,n)+...=2^(n-1)

    something else:

    1.n个人围着一张圆桌坐在一起,共有(n-1)! 种坐法。

    2.从n个排成一排的数中取m个数,且数字之间互不相邻,共有C(m,n-m+1)种取法。

    二次项定理:

    (a+b)^n=∑(0<=k<=n)C(k,n)*(a^k)*(b^(n-k))

    友情证明:可爱的数学归纳法

          当n=1时,(a+b)^1=C(0,n)*(a^0)*(b^1)+C(1,n)*(a^1)*(b^0)=a+b成立

          假设当n=m时命题成立,当n=m+1时:

          (a+b)^(m+1)=(a+b)(a+b)^m

          =(a+b)∑(0<=k<=n)C(k,m)*(a^k)*(b^(m-k))

          =...=∑(0<=k<=m+1)C(k,m+1)*(a^k)*(b^(m+1-k))

    那么,二次项定理有什么用呢?

    我可以负责任的告诉你,这个数学里是经常考的,2017年的浙江高中数学省赛卷第一题就是这个东西,它可以被用于证明可爱的费马小定理...我知道你心里已经开始喊停了...

    但数学和信息是分不开的,数学班的同学告诉我们数学老师在数学班里讲树还有剪枝,数学奥林匹克命题人讲座(简称命题人)的《组合问题》的编写者之一就是毕业于计算机系的...

    所以还是对数学好点吧。

    正事,想知道浙江省省赛卷第一题是怎么出的吗?(不想知道,我还是会讲)

    二次项定理的直接运用,我们把他变成OI题,如下:

    题目:给定一个多项式(ax+by)^k,求出多项式展开后的x^n*y^m项的系数,对10007取模。

    0<=n,m<=k<=1000,n+m=k,0<=a,b<=1000000。

              根据二次项定理,有(ax+by)^k=∑(0<=i<=k)C(i,k)*(a^i)*(b^(k-i))*(x^i)*(y^(k-i))

             所以(x^n)*(y^m)的系数即为C(n,k)*(a^n)*(b^m),直接计算就好。

    隔板法

    隔板法又称插空法,就是在n个元素间插入(m-1)个板,即把n个元素分成m组的方法。

    eg:

    将20个大小形状完全相同的小球放入3个不同的盒子,允许有盒子为空,但球必须放完,有多少种不同的方法?
     
    分析:本题中的小球大小形状完全相同,故这些小球没有区别,问题等价于将小球分成三组,允许有若干组无元素,用隔板法.
     
    解析:将20个小球分成三组需要两块隔板,因为允许有盒子为空,不符合隔板法的原理,那就人为的再加上3个小球,保证每个盒子都至少分到一个小球,那就符合隔板法的要求了(分完后,再在每组中各去掉一个小球,即满足了题设的要求)。然后就变成待分小球总数为23个,球中间有22个空档,需要在这22个空档里加入2个隔板来分隔为3份,共有C(22,2)=231种不同的方法.
     
    点评:对n件相同物品(或名额)分给m个人(或位置),允许若干个人(或位置)为空的问题,可以看成将这n件物品分成m组,允许若干组为空的问题.将n件物品分成m组,需要m-1块隔板,将这n件物品和m-1块隔板排成一排,占n+m-1位置,从这n+m-1个位置中选m-1个位置放隔板,因隔板无差别,故隔板之间无序,是组合问题,故隔板有Cn+m-1 m-1种不同的方法,再将物品放入其余位置,因物品相同无差别,故物品之间无顺序,是组合问题,只有1种放法,根据分步计数原理,共有Cn+m-1 m-1×1=Cn+m-1 m-1种排法.
     
    那么就引出了一个大大的栗子-o.o-球和袋子的问题 

           n个球和m个袋子,已经有大佬总结好。

    这里呢我们再小小的分析一下球和袋子的问题:

          1.将n个不同的球放到m个相同的袋子里有多少种方案?(没有空袋子)

    用f[i][j]表示将i个不同的球放到j个相同的袋子,并保证每个袋子里都有球的方案数。

    我们考虑第i个球是不是单独放的,f[i][j]=f[i-1][j-1]+f[i-1][j]*j

    答案是f[n][0]+f[n][1]+...f[n][m].时间复杂度是O(nm)

     以上为ppt原话,反正我是没怎么懂那个式子是怎么出来的,各位大佬可能懂了吧,我太菜了啊~~~那么,不懂的和我一样的蒟蒻们来看一下我的思路吧:(来自一位蒟蒻的分享)

    f[i][j]表示将i个不同的球放到j个相同的袋子中,

    假设前面的i-1个球都放好了,放在了j个袋子里,其方案数为f[i-1][j],此时还有一个球要和哪一坨球同居呢?有j个袋子,有j种选择,所以为f[i-1][j]*j(乘法原理,不要告诉我你不会,这真的是小学数学) 。

    假设前i-1个球放在了j-1个袋子里,那么第i个球一定在剩余的空袋子里(保证每个袋子里都有球)已有的方案数为f[i-1][j-1].

    加一加,就得到了大佬ppt上的式子:f[i][j]=f[i-1][j-1]+f[i-1][j]*j

     

         2.将n个相同的球放在m个相同的袋子里有多少种方案?

    由于袋子是相同的,我们通过保证球数是单调不减的来防止重复统计。用f[i][j]表示将i个相同的球放到j个相同的袋子里的方案数。

    考虑第一个袋子是否放球,如果放的话,由于球数单调不减,我们必须在每个袋子里都放一个球。

    如果不放的话,那我们直接考虑后面的袋子。

    f[i][j]=f[i-j][j]+f[i][j-1].时间复杂度O(nm)

    G102的孤儿们都要好好的啊。
  • 相关阅读:
    几种二叉可并堆(详细)
    几种二叉可并堆(详细)
    Winsock编程基础介绍 . 分类: VC++ 2013-09-14 17:30 512人阅读 评论(0) 收藏
    VS2005+WINDDK+Driver Studio 3.2个人总结 分类: VC++ 2013-09-14 17:26 593人阅读 评论(0) 收藏
    用DDK开发的9054驱动 . 分类: windows驱动程序WDM 2013-09-14 17:24 625人阅读 评论(0) 收藏
    arm-linux-gcc下载与安装 分类: arm-linux-Ubuntu 2013-09-11 14:12 698人阅读 评论(0) 收藏
    u盘安装ubuntu10.04 server.txt 分类: arm-linux-Ubuntu 2013-09-11 14:10 882人阅读 评论(1) 收藏
    Makefile的规则 分类: arm-linux-Ubuntu 2013-09-11 14:09 517人阅读 评论(0) 收藏
    学习了LINUX下用C语言遍历文件夹,一些心得 分类: arm-linux-Ubuntu 2013-09-11 14:09 885人阅读 评论(1) 收藏
    dm642的中断定时器 分类: DSP 2013-09-10 14:35 660人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/ve-2021/p/9128527.html
Copyright © 2011-2022 走看看