• 母函数应用


    砝码称重

    有了对母函数的一般认识后,我们可以用它来解决一些简单的计数问题,比如说下面这道题:我们有1234g四个砝码,一共可以称出多少种重量;而且,对于某一个重量,共有多少种称法?这个可以直接用母函数求解,1g的对应1+x2g的对应1+x2,以此类推。所以整个母函数就是G(x)=(1+x)(1+x2)(1+x3)(1+x4).我们只要将其连乘展开,每一项的系数就是对应x的k次幂,加起来有k克的话,有多少种可能性。展开后我们得到

    G(x)=(1+x)(1+x2)(1+x3)(1+x4)=1+x+x2+2x3+2x4+2x5+2x6+2x7+2x8+x9+x10

    也就意味着,能从1克称到10克,一共能称出10种,某个重量有多少种组成方案呢?答案就是对应幂次前面的系数了。

     

    这个时候我们会发现,砝码的计数不再需要一个一个地枚举了,我们只需要列出它的母函数,将其展开就可以对其组合方案一目了然了。不过这种确定的方案不唯一,那么有没有一种方法能帮我们唯一确定重量呢?

     

    来看这道题:若有12481632g的砝码各一枚,问能称出哪几种重量,有几种可能方案?

    那它的母函数就是G(x)=(1+x)(1+x2)(1+x4)(1+x8)(1+x16)(1+x32),这个时候,我们已经建立了每个砝码对应的母函数后,通过相乘就得到了整个问题的母函数。但很显然,这个式子展开的话很复杂,怎么简便地展开呢。首先,看到(1+x)回想一下中学时的“平方差公式”——(1+x)(1-x)=(1-x2),所以我们可以用(1-x2)/(1-x)来代替(1+x),其余高次项同理。

    所以化简后的母函数就是这样:

    嘿!伙计,看我们发现了什么——斜着可以抵消,那这个式子最后就变成了(1-x64)/(1-x),现在的问题转化成了求这个表达式的值,那我们也知道(1-x)(1+x+x2+…+x63)=(1-x64)这样一个事实,因此:

    所以一共可以称出从0克到63克的质量,根据系数,每种称重只有一种方案。

     

    那根据这个例子,我们可以看到,只要用1248这样2的k次幂克数做砝码,就能唯一确定一些重量了。同时也要注意到,如果2的k次方进行累加的话,就会有这样一条性质:任何一个10进制数n,都可以唯一的表达成2的k次方进行累加,用数学表达式写就是:

    换句话说,一个10进制数,对应,且仅对应一个二进制数。这也是使用二进制数合理的原因。

     

    整数拆分

    下面我们来分析一下有关整数的拆分,比如说对于一个十进制数,也可以拆成很多个数相加。假如说有一个数n,要拆分成123m的和,并允许重复,求其母函数。根据前面的经验,分析一下问题,可以得到

    G1(x)=(1+x+x2+...)(1+x2+x4+...)...(1+xm+x2m+...)

    emmm有点复杂啊我的老伙计,想想高数里的泰勒展开,找与上式类似的进行合并。

    所以每一项都可以写成对应的分式:

    将分母进行累乘,就得到了

    到这里就不再继续计算了,明白思想就好。

     

    我们再深入一下,讨论如果在拆分的时候其中的m至少出现过一次,那母函数会是怎么样的呢?仔细想想,其实应该和前面差不多,只是这里的m和上一道题略有不同。

    G2(x)=(1+x+x2+...)(1+x2+x4+...)...(xm+x2m+...)

    最后一个括号里缺了个1,当然啊,要求m至少出现一次,那就不可能不出现,就没有1了。那对这样一个式子我们如何去进一步地抽象呢——可以提出全部的m次方,最后一个括号里就又变成了

    (1+xm+x2m+...)

    后面再多乘一个x^m,放到分子上,

    所以这就是它的母函数,我们用G2表示。这是一种分析方法

     

    反过来讲,对应于m至少出现一次的,可以用全部方案减去m一次都不出现,那m根本不出现意味着只拆分到m-1

    因此第一个式子代表1m拆分,第二个代表1到m-1进行拆分,相减就得到m至少出现一次的拆分数。

     

    上面这些例子离生活挺远的,“道理我都懂,但这些有什么卵用啊”可能是大家脑海里的想法吧2333 

     

    我们比较关心的整数拆分可能就是钱了,那来看一下钱的表现力,用母函数分析一下硬币的组合,说到这里,应该能想到之前学c语言里讲过通过多重循环枚举算出硬币的组合方案,那个太暴力了,时间复杂度很高,我们现在找一种聪明的办法。以人民币为例,有1角,5角,1元的常用硬币,它的母函数就是

    G(x)=(1+x10+x20+...)(1+x50+x100+...)(1+x100+x200+...)

    每一个括号里都是无穷多项,因为这里的每一种硬币不限制数量,和上面的砝码不同。

     

    那美元的硬币有怎样的表现力呢,常见的有1角,2.5角(quarter),美元硬币的母函数就是

    G(x)=(1+x10+x20+...)(1+x25+x50+...)

     

    通过对比两种常用硬币的组合方案,有如下的统计

    可以看出,还是人民币的表现形式更丰富一些2333

     

    btw 有时候在美国超市还会看到9毛5这样的分数,因为还有一种5分硬币,这个不太常用,但是如果把这个也计算在内,再分析它的表现力,就会得到——

    这时候美元的表现力陡然增加。它的组合数会非常之多,我们可以看到,仅仅是这样一个简单的组合问题,就有这么多的变化形式,仅仅利用枚举是做不到的,但是有了母函数,我们可以非常灵活地处理这些计数问题。

  • 相关阅读:
    markdown语法---根据使用不断扩充中
    Linux命令(七)查找文件或目录 find
    Linux命令(六) 查看文件 cat tac more less tail
    Linux命令(五)创建文件或修改文件时间 touch
    Linux终端常用快捷键
    Linux命令(四)删除文件 rm
    实现免密码输入 ssh 登录
    jenkins 进阶系列网址
    shell与if相关参数
    安装tomcat过程中出现问题小结
  • 原文地址:https://www.cnblogs.com/hongshijie/p/7745934.html
Copyright © 2020-2023  润新知