文章目录

  • 1.指数型母函数的定义
  • 2.多重集排列问题
  • 3.指数型母函数求解多重集排列问题
  • 4.模板
  • 5.泰勒展开式的应用
  • 6.练手题目

1.指数型母函数的定义

对于一个序列a0,a1,a2⋅⋅⋅⋅ana^0,a^1,a^2\cdot\cdot\cdot\cdot a^na0,a1,a2⋅⋅⋅⋅an,我们称a00!+a11!⋅x1+a22!⋅x2+a33!⋅x3+⋅⋅⋅+ann!⋅xn\frac{a_0}{0!}+\frac{a_1}{1!}\cdot x^1+\frac{a_2}{2!}\cdot x^2 +\frac{a_3}{3!}\cdot x^3+\cdot\cdot\cdot+\frac{a_n}{n!}\cdot x^n0!a0​​+1!a1​​⋅x1+2!a2​​⋅x2+3!a3​​⋅x3+⋅⋅⋅+n!an​​⋅xn为该序列的指数型母函数

指数型母函数算是普通型母函数的延伸,不太懂母函数的可以先看这个,普通型母函数

2.多重集排列问题

有n种物体,给出每种物体的数量,现从中选出m个进行排列,问你排列方案有多少种。

3.指数型母函数求解多重集排列问题

证明过程点这里
过程很详细。

如何构造指数型母函数:

以三种物体,分别有2,2,3个为例,

则可构造如下母函数:

(1+x11!+x22!)⋅(1+x11!+x22!)⋅(1+x11!+x22!+x33!)(1+\frac{x^1}{1!}+\frac{x^2}{2!})\cdot(1+\frac{x^1}{1!}+\frac{x^2}{2!})\cdot(1+\frac{x^1}{1!}+\frac{x^2}{2!}+\frac{x^3}{3!})(1+1!x1​+2!x2​)⋅(1+1!x1​+2!x2​)⋅(1+1!x1​+2!x2​+3!x3​)

解释:

一个括号内的内容为一个多项式,第一个多项式代表第一种物品的选取情况,每一项的指数代表选取个数,如x2x^2x2代表第一种物品选两次,那么第一个多项式就涵盖了第一种物品的所有选取情况(0,1,2)。

第二个多项式同理,第三个多项式多了一项,因为第三种物体有3个,多一种选择的情况。

与普通型母函数对比:

①每一个多项式的指数都是连续的(因为指数代表的意义不同了,普通型母函数用指数代表权值,这里用指数代表选取个数)
②分母多了个阶乘,原因可见上面的链接,内有证明过程

求解:

构造完之后,和普通型母函数一样暴力展开就能得到答案了

继续上面的例子,将展开式展开即得:

1+3x+92x2+2563+3112x4+1312x5+724x6+124x71+3x+\frac{9}{2}x^2+\frac{25}{6}^3+\frac{31}{12}x^4+\frac{13}{12}x^5+\frac{7}{24}x^6+\frac{1}{24}x^71+3x+29​x2+625​3+1231​x4+1213​x5+247​x6+241​x7

如果我们要求从上述物品中选取r个进行排列,只要找到指数为r的项,再将其系数乘以r的阶乘,原因可见上面证明过程的链接

对于指数型母函数来说,它的每一项的系数都是ann!\frac{a_n}{n!}n!an​​,而其中真正有用的是ana_nan​,这与用普通型母函数解决多重集组合问题单纯取系数不同。

4.模板

代码都有注释,需要注意的是结尾的输出要用%.0f,用%.0lf会输出0或-0我也不知道,用(int)强制转换也是不行的,因为会截断,而答案需要四舍五入(应该是精度问题造成的,不然答案本来就应该是整数)

#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;int  fact[15];void fact_calculate(){//阶乘计算fact[0]=fact[1]=1;for(int i=2;i<=10;i++)fact[i]=i*fact[i-1];
}int main()
{int n,m;double c[15],temp[15]; //c数组存放系数int num[15];      //存放第i种物品有几个fact_calculate();while(~scanf("%d%d",&n,&m)){memset(c,0,sizeof(c));for(int i=1;i<=n;i++)scanf("%d",&num[i]);for(int i=0;i<=num[1];i++)   //c数组初始化第一个多项式的系数c[i]=1.0/fact[i];for(int i=2;i<=n;i++){    //i表示运算到第几个多项式memset(temp,0,sizeof(temp));for(int j=0;j<=m;j++)     //循环到m项就可以,因为求的是m排列,后面的项计算了也没有意义for(int k=0;k<=num[i]&&k+j<=m;k++)temp[k+j]+=(1.0*c[j]/fact[k]);for(int j=0;j<=m;j++)c[j]=temp[j];}printf("%.0f\n",c[m]*fact[m]);}return 0;}

5.泰勒展开式的应用

exe^xex的泰勒展开:

ex=1+x+x22!+x33!+⋅⋅⋅e^x=1+x+\frac{x^2}{2!}+\frac{x^3}{3!}+\cdot\cdot\cdotex=1+x+2!x2​+3!x3​+⋅⋅⋅

可见其与我们构造的指数型母函数是恰好契合的

扩展:

e−x=1−x+x22!−x33!+⋅⋅⋅e^{-x}=1-x+\frac{x^2}{2!}-\frac{x^3}{3!}+\cdot\cdot\cdote−x=1−x+2!x2​−3!x3​+⋅⋅⋅

则:

ex+e−x2=1+x22!+x44!+⋅⋅⋅\frac{e^x+e^{-x}}{2}=1+\frac{x^2}{2!}+\frac{x^4}{4!}+\cdot\cdot\cdot2ex+e−x​=1+2!x2​+4!x4​+⋅⋅⋅

ex−e−x2=1+x+x33!+⋅⋅⋅\frac{e^x-e^{-x}}{2}=1+x+\frac{x^3}{3!}+\cdot\cdot\cdot2ex−e−x​=1+x+3!x3​+⋅⋅⋅

具体应用:

可看红色病毒 这题

题解:点击跳转

6.练手题目

  1. 排列组合
    这应该是入门的板子题,我刚开始做的时候用了dfs的做法,虽然都过了,但相比之下母函数的做法要快得多,点此处查看题解
  2. 红色病毒
    运用到了高数里的泰勒展开,点此处查看题解

【组合数学】指数型母函数(多重集排列问题)相关推荐

  1. 【组合数学】指数型母函数 应用 ( 多重集排列问题 | 不同球放在不同盒子里 | 奇/偶数序列的指数生成函数推导 )

    文章目录 多重集全排列公式 指数型母函数 处理多重集排列问题 引入 指数型母函数 处理多重集排列问题 公式推导 指数型母函数 处理 有限数字串问题 指数型母函数 处理 n 位数字串问题 指数型母函数 ...

  2. 数学--数论-多重集排列组合与母函数

    一.无重复元素的排列组合定义 排列,英文名为Permutation,是指从某元素集合中取出指定个数的元素进行排序 组合,英文名为Combination,是指从某元素集合中仅仅取出指定个数的元素,不考虑 ...

  3. 【组合数学】指数生成函数 ( 指数生成函数求解多重集排列示例 2 )

    文章目录 一.指数生成函数求解多重集排列示例 2 参考博客 : 按照顺序看 [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相 ...

  4. 【组合数学】指数生成函数 ( 指数生成函数求解多重集排列示例 )

    文章目录 一.指数生成函数求解多重集排列示例 参考博客 : 按照顺序看 [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相关 ...

  5. 【组合数学】指数生成函数 ( 证明指数生成函数求解多重集排列 )

    文章目录 一.证明指数生成函数求解多重集排列 参考博客 : 按照顺序看 [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相关 ...

  6. 【组合数学】指数生成函数 ( 指数生成函数性质 | 指数生成函数求解多重集排列 )

    文章目录 一.指数生成函数性质 二.指数生成函数求解多重集排列 参考博客 : 按照顺序看 [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | ...

  7. 【组合数学】排列组合 ( 多重集排列 | 多重集全排列 | 多重集非全排列 所有元素重复度大于排列数 | 多重集非全排列 某些元素重复度小于排列数 )

    文章目录 一.多重集 二.多重集全排列 三.多重集全排列示例 三.多重集非全排列 1 所有元素重复度大于排列数 ( ni≥rn_i \geq rni​≥r ) 四.多重集非全排列 2 某些元素重复度小 ...

  8. 快乐地打牢基础(13)——普通型母函数和指数型母函数的应用

    母函数就是一列用来展示一串数字的挂衣架. --赫伯特·唯尔夫 . 一.普通型母函数 1.定义 对于任意数列 a 0 , a 1 , a 2 . . . a n a_0,a_1,a_2...a_n a0 ...

  9. hdu1521 指数型母函数

    排列组合 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  10. 【组合数学】集合的排列组合问题示例 ( 排列 | 组合 | 圆排列 | 二项式定理 )

    文章目录 一.集合排列 和 多重集排列问题 1 二. 集合排列 和 多重集排列问题 2 三. 找一一对应计算集合排列问题 ( 反向计算 ) 四. 圆排列问题 1 五. 集合交替排列问题 六. 圆排列问 ...

最新文章

  1. 应用程序进程(一):创建应用程序
  2. 5G NGC — 关键技术 — R15 SBA
  3. YOLO3实现目标检测(VS2015+OPENCV3.4.2+YOLO3+CUDA10.0+CUDNN7.5)
  4. ubuntu下查询SSH状态和安装SSH服务
  5. 基于FPGA的直流电机PWM控制+毕业论文
  6. 08、单链表编程考点
  7. 微型计算机生产制约因素,精品解析:广东省东莞市2019-2020学年高三下学期第一次统考(5月)模拟考试文科综合地理试题...
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的漫画社区
  9. 文本分类(一)封装分词器
  10. Spring Cloud Stream与RabbitMQ 死信队列
  11. 观点 PK | 商用 PC or 消费 PC,开发者究竟该如何取舍?
  12. 图片列表模板 html代码,图片列表模板
  13. gulp + angular + requirejs 简单学习
  14. ACS被集成到了Windows Azure Management Portal中
  15. 果然有人向吾了解如果改进doubango的问题
  16. 网络继电器的EPICS IOC搭建
  17. 上传,修改头像的使用
  18. 热血传奇服务端源代码分析笔记
  19. 深度分析:OA产品的技术发展过程及未来趋势
  20. ES数据库重建索引——Reindex(数据迁移)

热门文章

  1. UWP: 通过命令行启动 UWP 应用
  2. uwp浏览器java源码_从网站打开UWP应用程序
  3. 手动揪出电脑中毒导致的空间自动发广告的元凶
  4. Vmware workstation 16pro解锁装MacOS
  5. Windows使用ROS机器人操作系统12记录
  6. 天空之城用计算机弹歌,原神琴谱天空之城怎么弹?天空之城琴谱一览
  7. csharp基础练习题:卡塔劳尔【难度:1级】--景越C#经典编程题库,不同难度C#练习题,适合自学C#的新手进阶训练
  8. cidr计算器android,JavaScript 实现 CIDR 详细信息计算
  9. 电容之超级电容简易测试方法
  10. android 家庭监控,最好的三款家庭安防智能监控APP