生成函数(母函数)

什么是生成函数:wiki上的介绍

在数学中,某个序列(an)n∈N\large {\displaystyle (a_{n})_{n\in \mathbb {N} }}(an​)n∈N​ 的母函数(又称生成函数,英语:Generating function)是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。使用母函数解决问题的方法称为母函数方法

母函数可分为很多种,包括普通母函数指数母函数L级数贝尔级数狄利克雷级数。对每个序列都可以写出以上每个类型的一个母函数。构造母函数的目的一般是为了解决某个特定的问题,因此选用何种母函数视乎序列本身的特性和问题的类型。

母函数,又称生成函数,是ACM竞赛中经常使用的一种解题算法,常用来解决组合方面的题目。

生成函数的定义:g(x)=a0+a1x+a2x2+a3x3+...\large g(x)=a_0+a_1x+a_2x^2+a_3x^3+...g(x)=a0​+a1​x+a2​x2+a3​x3+...称g(x)\large g(x)g(x)是序列a0,a1,a2,...a_0,a_1,a_2,...a0​,a1​,a2​,...的生成函数。

小题


一、

有1克、2克、3克、4克的砝码各一枚,能称出哪几种重量?每种重量各有几种可能方案?

我们用母函数来解决这个问题

1个1克砝码可以看成1+x^1,1表示不取,x^1表示取一个,以下同理
1个2克砝码可以看成1+x^2
1个3克砝码可以看成1+x^3
1个4克砝码可以看成1+x^4

那么生成函数就是

g(x)=(1+x1)(1+x2)(1+x3)(1+x4)=1+x+x2+2x3+2x4+2x5+2x6+2x7+x8+x9+x10\large g(x)=(1+x^1)(1+x^2)(1+x^3)(1+x^4)\\=1+x+x^2+2x^3+2x^4+2x^5+2x^6+2x^7+x^8+x^9+x^{10}g(x)=(1+x1)(1+x2)(1+x3)(1+x4)=1+x+x2+2x3+2x4+2x5+2x6+2x7+x8+x9+x10

这个函数中可以看出重量为3克的方案有两种,重量为7的方案有两种,重量为10的有1种。

不难发现指数表示重量,系数表示方案数。


二、

求用1分、2分、3分的邮票贴出不同数值的方案数:
大家把这种情况和第一种比较有何区别?第一种每种是一个,而这里每种是无限的。

那么生成函数就是g(x)=(1+x+x2+x3+...)(1+x2+x4+x6+...)(1+x3+x6+x9+...)\large g(x)=(1+x+x^2+x^3+...)(1+x^2+x^4+x^6+...)(1+x^3+x^6+x^9+...)g(x)=(1+x+x2+x3+...)(1+x2+x4+x6+...)(1+x3+x6+x9+...)

以展开后的x^4为例,其系数为4,即4拆分成1、2、3之和的拆分方案数为4;

即 :4=1+1+1+1=1+1+2=1+3=2+2


三、

设有n个标志为1,2,…,n的网袋,第i个(i=1,2,…n)网袋里放有ni个球。不同网袋里的球是不同的,而同一网袋里的球则是没有差别的,认为是相同的。询问从中取r个球的方案数。

设生成函数g(x)=(1+x1+x2+...+xn1)(1+x1+x2+...+xn2)...\large g(x)=(1+x^1+x^2+...+x^{n1})(1+x^1+x^2+...+x^{n2})...g(x)=(1+x1+x2+...+xn1)(1+x1+x2+...+xn2)...

最后指数为r的那一项的系数就是方案数。


总结一下,生成函数大多用来解决有限或无限物体的组合方案。

给出通用模板,其实就是暴力拆这个函数罢了。

#include<cstdio>
using namespace std;
int N,g[2][125];
int main(){while(~scanf("%d",&N)){for(int i=0;i<=N;++i) g[1][i]=1,g[0][i]=0;for(int i=2;i<=N;++i){for(int j=0;j<=N;++j)for(int k=0;k<=N-j;k+=i) g[i&1][j+k]+=g[1-(i&1)][j];for(int j=0;j<=N;++j) g[1-(i&1)][j]=0;}printf("%d\n",g[N&1][N]);}return 0;
}

以上是一些基础,接下来给一道难题(反正我一点也不会,逃):BZOJ4001

不会也没有关系,我们慢慢来。


特殊情况

当a={1,1,1,1,...}a=\{1,1,1,1,...\}a={1,1,1,1,...}时f(x)=1+x+x2+x3+...=11−x\large f(x)=1+x+x^2+x^3+...=\frac{1}{1-x}f(x)=1+x+x2+x3+...=1−x1​

这又是为什么呢?

我们发现f(x)\large f(x)f(x)是一个等比数列

又因为x∈(−1,1)x∈(-1,1)x∈(−1,1)

所以当n→∞n \to \inftyn→∞时,1−xn1−x\frac{1-x^n}{1-x}1−x1−xn​中,xn→0x^n \to 0xn→0,所以f(x)=1+x+x2+x3+...=11−x\large f(x)=1+x+x^2+x^3+...=\frac{1}{1-x}f(x)=1+x+x2+x3+...=1−x1​

同理f‘(x)=1+2x+3x2+4x3+...=1(1−x)2=(11−x)2=f2(x)\large f`(x)=1+2x+3x^2+4x^3+...=\frac{1}{(1-x)^2}=(\frac{1}{1-x})^2=f^2(x)f‘(x)=1+2x+3x2+4x3+...=(1−x)21​=(1−x1​)2=f2(x)

f‘‘(x)=1+3x+6x2+10x3+15x4...=1(1−x)3=f3(x)\large f``(x)=1+3x+6x^2+10x^3+15x^4...=\frac{1}{(1-x)^3}=f^3(x)f‘‘(x)=1+3x+6x2+10x3+15x4...=(1−x)31​=f3(x)

推广1(1−x)k=∑i∞Ci+k−1k−1xi=fk(x)\large \frac{1}{(1-x)^k}=\sum_{i}^{\infty} C_{i+k-1}^{k-1}x^i=f^k(x)(1−x)k1​=∑i∞​Ci+k−1k−1​xi=fk(x)

用组合数学中的所谓“隔板法”求一下,第iii项的系数就是Ci+k−1k−1C_{i+k-1}^{k-1}Ci+k−1k−1​


斐波那契通项公式

下面我们用生成函数求斐波那契数列的通项公式:

首先f(x)=x+x2+2x3+3x4+5x5+...\large f(x)=x+x^2+2x^3+3x^4+5x^5+...f(x)=x+x2+2x3+3x4+5x5+...

将f(x)f(x)f(x)乘上个xxx,然后相减

f(x)−x∗f(x)=(x+x2+2x3+3x4+...)−(x2+x3+2x4+3x5+...)=x+x3+x4+2x5+3x6=x+x2f(x)\large f(x)-x*f(x)=(x+x^2+2x^3+3x^4+...)-(x^2+x^3+2x^4+3x^5+...)=x+x^3+x^4+2x^5+3x^6=x+x^2f(x)f(x)−x∗f(x)=(x+x2+2x3+3x4+...)−(x2+x3+2x4+3x5+...)=x+x3+x4+2x5+3x6=x+x2f(x)

解f(x)f(x)f(x)得f(x)=x1−x−x2f(x)=\frac{x}{1-x-x^2}f(x)=1−x−x2x​

然后如何还原成序列呢?

先因式分解

x1−x−x2=x(1−1−52x)(1−1+52x)\large \frac{x}{1-x-x^2}=\frac{x}{(1-\frac{1-\sqrt{5}}{2}x)(1-\frac{1+\sqrt{5}}{2}x)}1−x−x2x​=(1−21−5​​x)(1−21+5​​x)x​

用裂项法1n(n+k)=1k(1n−1n+k)\frac{1}{n(n+k)}=\frac{1}{k}(\frac{1}{n}-\frac{1}{n+k})n(n+k)1​=k1​(n1​−n+k1​)得

x(1−1−52x)(1−1+52x)=1(1−1−52x)((1−1−52x+(−5x))x=1−5(11−1−52x−11−1+52x)=−1511−1−52x+1511−1+52x\large \frac{x}{(1-\frac{1-\sqrt{5}}{2}x)(1-\frac{1+\sqrt{5}}{2}x)}\\ \large=\frac{1}{(1-\frac{1-\sqrt{5}}{2}x)((1-\frac{1-\sqrt{5}}{2}x+(-\sqrt{5}x))}x\\ \large=\frac{1}{-\sqrt{5}}(\frac{1}{1-\frac{1-\sqrt{5}}{2}x}-\frac{1}{1-\frac{1+\sqrt{5}}{2}x})\\ \large=-\frac{1}{\sqrt{5}}\frac{1}{1-\frac{1-\sqrt{5}}{2}x}+\frac{1}{\sqrt{5}}\frac{1}{1-\frac{1+\sqrt{5}}{2}x}(1−21−5​​x)(1−21+5​​x)x​=(1−21−5​​x)((1−21−5​​x+(−5​x))1​x=−5​1​(1−21−5​​x1​−1−21+5​​x1​)=−5​1​1−21−5​​x1​+5​1​1−21+5​​x1​

把他分裂成等比数列的形式。

an=−15(1−52)n+15(1+52)n\large a_n=-\frac{1}{\sqrt{5}}(\frac{1-\sqrt{5}}{2})^n+\frac{1}{\sqrt{5}}(\frac{1+\sqrt{5}}{2})^nan​=−5​1​(21−5​​)n+5​1​(21+5​​)n

这就是斐波那契数列通项公式。


终于写完了,接下来就是多刷例题训练了。

HDU1028

HDU1085

洛谷P2000

BZOJ3028

转载于:https://www.cnblogs.com/XSamsara/p/10547940.html

生成函数(母函数)——目前最全的讲解相关推荐

  1. 藤摇椅游戏道具制作全流程讲解视频教程

    藤摇杆|一个完整的游戏资产工作流程 MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 含工程素材 语言:英语+中文字幕(根据原英文字幕机译更准确)+原英文字幕 | ...

  2. ML之LoR:基于信用卡数据集利用LoR逻辑回归算法实现如何开发通用信用风险评分卡模型之以toad框架全流程讲解

    ML之LoR:基于信用卡数据集利用LoR逻辑回归算法实现如何开发通用信用风险评分卡模型之以toad框架全流程讲解 目录 基于信用卡数据集利用LoR逻辑回归算法实现如何开发通用信用风险评分卡模型之以to ...

  3. C语言——史上最全通讯录讲解(附源码)

    C语言--史上最全通讯录讲解(附源码) 一.开始界面的打印 二.对六大板块进行定义操作 三.对联系人进行初始化 四.对通讯录进行初始化 4.1动态版本 4.2静态版本 五.通讯录六大功能的具体实现 5 ...

  4. 搭建直播平台中的美颜效果开源实现,从AI到美颜全流程讲解

    搭建直播平台中的美颜效果开源实现,从AI到美颜全流程讲解 美颜和短视频 美颜相关APP可以说是现在手机上的必备的软件,例如抖音,快手,拍出的"照骗"和视频不加美颜效果,估计没有人敢 ...

  5. ML之LoR:基于信用卡数据集利用LoR逻辑回归算法实现如何开发通用信用风险评分卡模型之以scorecardpy框架全流程讲解

    ML之LoR:基于信用卡数据集利用LoR逻辑回归算法实现如何开发通用信用风险评分卡模型之以scorecardpy框架全流程讲解 目录 基于信用卡数据集利用LoR逻辑回归算法实现如何开发通用信用风险评分 ...

  6. 提高生产力,最全 MyBatisPlus 讲解!

    如果你每天还在重复写 CRUD 的 SQL,如果你对这些 SQL 已经不耐烦了,那么你何不花费一些时间来阅读这篇文章,然后对已有的老项目进行改造,必有收获! 一.MP 是什么 MP 全称 Mybati ...

  7. Android布局延伸状态栏,Android沉浸式全屏讲解(状态栏、导航栏处理)

    Android应用中经常会有一些要求全屏显隐状态栏导航栏的需求.通过全屏沉浸式的处理可以让应用达到更好的显示效果.下面系统的讲解一下有关全屏,隐藏状态栏导航栏,沉浸式的知识. 在Android4.1之 ...

  8. android 沉浸式菜单栏,Android沉浸式全屏讲解(状态栏、导航栏处理)

    Android应用中经常会有一些要求全屏显隐状态栏导航栏的需求.通过全屏沉浸式的处理可以让应用达到更好的显示效果.下面系统的讲解一下有关全屏,隐藏状态栏导航栏,沉浸式的知识. 在Android4.1之 ...

  9. 生成函数(母函数)入门详解

    感谢大佬! 感谢大佬 本文章从以上两位大佬的博客参考而来!再次感谢! 母函数,又称生成函数,是ACM竞赛中经常使用的一种解题算法,常用来解决组合方面的题目. 在数学中,某个序列的母函数(Generat ...

最新文章

  1. 关于Silverlight_Tools.exe安装不上的问题
  2. putty 保存密码 自动登陆 四种方法
  3. koa mysql 存储过程_Sql中判断数据库、表、临时表、存储过程和列是否存在...
  4. jQuery 3教程(三):jQuery集合
  5. linux的lsm--TCB组成部分的新视角
  6. python可视化水平双向箭头_python数据可视化第二弹
  7. 巧用css的border属性完成对图片编辑功能的性能优化
  8. Centos7使用Docker创建Oracle11g
  9. AJAX设置光标离开自动提交,Ajax自动提交和刷新页面
  10. Vue v-on v-model 组合使用
  11. CentOS7下安装并简单设置PostgreSQL笔记
  12. java调试程序(eclipse)
  13. Android性能优化-过度绘制解决方案
  14. vb中查询mysql_vb数据库查询语句-vb中使用sql语句-vb读取sql语句的字段
  15. mysql stmt num rows_php – MySQLi stmt num_rows返回0
  16. spark学习五——归属地计算案例
  17. 2021最新WordPress安装教程(一):Centos7安装Apache
  18. 页面打印不全怎么办html css,win7打印网页显示不全怎么办|win7设置网页打印页面的方法...
  19. java super extend 区别_Java泛型中extends和super的区别
  20. mysql increment_mysql中auto_increment用法详解

热门文章

  1. 即时消息:消息收发架构
  2. 关于如何找到人生目标
  3. 鸿蒙王者荣耀评测,王者荣耀评测_妹纸玩家上手必坑英雄盘点 李白韩信榜首有名|攻略...
  4. 关于老鼠撞断大象肋骨的调查处理报告
  5. March 27th Tuesday (三月  二十七日 火曜日)
  6. 一站到底名人堂成员_《一站到底》首推名人堂概念,将匠心继续到底
  7. 修复金山云KSYStreamer 在Android P以上机型Native Crash
  8. 没文化的当老板,有学问的当员工。
  9. tp5.0操作phpexcel
  10. 乐视android版本怎么升级,乐视手机EUI系统升级教程 乐视手机EUI系统怎么升级