母函数应用

砝码称重

 

有了对母函数的一般认识后,我们可以用它来解决一些简单的计数问题,比如说下面这道题:我们有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分硬币,这个不太常用,但是如果把这个也计算在内,再分析它的表现力,就会得到——

母函数应用

 

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

上一篇:Symfony2CookBook:如何将变量注入全部模板(如全局变量)


下一篇:微信小程序把玩(二十五)loading组件