资源描述:
《普通型母函数初级教程 --by 晓露式泠》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、普通型母函数初级教程 --by式泠(Bstring)这几天一直在做这一类的题目。看的教程主要是业余ACmer大神TankyWoo的个人博客以及一些母函数课件(稍后发上)。(ACMer新手请先打开传送门http://www.matrix67.com/blog/archives/120,仔细研读一下Matrix67的大作先,要理解如何生成一个普通型生成函数)再
2、进TankyWoo的传送门(http://www.wutianqi.com/?p=596)同时开着这三个网页标签。。。往下看。。。。核心的一句话就是“把离散数列和幂级数 一一对应起来”(好好理解!)(PS:这里的幂级数不考虑收敛,故作形式幂级数) 接下来读懂模板中的数组c1和c2以及 i, j, k,这三个变量的含义。请先暂时不管后面的细节,可以这样看c1和c2的关系:c1是个桶,c2是个瓢,c2舀水倒进c1,不断的倒,直到c1满了。所以我才说c1应改为answer,而c2 应该为currentanswer
3、或temp。 再在细节上理解c1和c2和 i,j,k先在纸上把依照题意抽象出的生成函数的多项式写出,比如这么一个多项式。。。。 其实这个模板就是模拟这个多项式的相乘过程,其实这里的x是浮云,所以我提议直接写成这样 (0,1,2,3...)(0,2,4,6...)(0,3,6,9...)把指数这个衣服从x这个晾衣架下拿下来了多项式的相乘对于指数来说就是相加。c1数组在进入i,j,k的这个三重循环之前,有一个很重要
4、的初始化,c1的部分元素被刷成了1,这些1代表了第一个括号里的(0,1,2,3...)这些衣服原来所挂衣架x的系数。 下面进入很难理解的i, j, k三重循环。。。(洗把脸让脑袋清醒一下再看吧,孩纸们)——————————————————————————————————————用初中生的方法在纸上算一算(把省略号后面的数忽略吧)你可能会这样做:先乘前两个括号(木有数学公式插件,将就着看吧,主要得自己在纸上写): 1 * 1 + 1 *(x^2) +
5、1 *(x^4)+ x * 1 + x *(x^2) + x *(x^4)+(x^2)* 1 +(x^2)*(x^2) +(x^2)*(x^4) =(1+x+2(x^2)+x^3+2(x^4)+x^5 +x^6)然后再拿这个括号的每一项去乘上原式中的第三个括号……(这里我就不再写了,累死,不过你要理解的话还真得在纸上写完去!)没错,边写边对照这个for循环。。。(聪明的孩纸应该已经看懂了) 下面为了负责还是要面向一下普通大众(没
6、看懂就继续往下看吧,这里木有人会笑你的) 这里的变量i一般情况下i与乘式的状态有关,比如模板中的i从2开始,就是说先拿前两项相乘,还有重要的一点是可以利用i控制乘式中指数的增量,这道题的增量控制太简单了,其他题目中的增量控制可能就要有些变化了。i的最大值是整个多项式全部展开之后得到的最大指数,这个值一般可以通过题意得到或估算得到一个稍大的值。 变量j是非常费解的,真正理解可能要掌握DP(动态规划)。。。按照TankyWoo的和Seagg的讨论结果,j应该指示的是前i个括号乘起来之后的第j个变量。注意j的控制
7、条件是整个多项式展开之后的最小指数到最大指数的范围,增量是j++,不管题目怎么变,这个增量是不会变的。 变量k比较好理解了,就是第i个括号里的每一项的指数了,控制条件一般有两个(这个模板只有一个)一个是k的上限控制,不可超过第i个括号里的最大指数;一个是j+k的上限控制,不可超过整个多项式全部展开之后得到的最大指数。核心的式子出现了 ! c2[j+k]+=c1[j];好了,现在该看你的草稿纸上的算式了,这个式子反映的就是你的乘式中指数相加的步骤。THINKKKKKKKKKKING
8、 NOOOOOOOOOOOOOW !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!接下来一直累加c2,这个j的for循环终了之后,进入到同层次的第二个j的for循环,到这一步,程序已经帮你算完了前两个式子的相乘过程,c2这个瓢的水已经装满了,倒进c1这个桶。 程序又跳转到了下一个 i的for循环了(其实你可以通过单步调试慢慢查看每一个变量的动态,个人认为这是