【组合数学】指数型母函数(多重集排列问题)
文章目录
- 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+29x2+6253+1231x4+1213x5+247x6+241x7
如果我们要求从上述物品中选取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.练手题目
- 排列组合
这应该是入门的板子题,我刚开始做的时候用了dfs的做法,虽然都过了,但相比之下母函数的做法要快得多,点此处查看题解 - 红色病毒
运用到了高数里的泰勒展开,点此处查看题解
【组合数学】指数型母函数(多重集排列问题)相关推荐
- 【组合数学】指数型母函数 应用 ( 多重集排列问题 | 不同球放在不同盒子里 | 奇/偶数序列的指数生成函数推导 )
文章目录 多重集全排列公式 指数型母函数 处理多重集排列问题 引入 指数型母函数 处理多重集排列问题 公式推导 指数型母函数 处理 有限数字串问题 指数型母函数 处理 n 位数字串问题 指数型母函数 ...
- 数学--数论-多重集排列组合与母函数
一.无重复元素的排列组合定义 排列,英文名为Permutation,是指从某元素集合中取出指定个数的元素进行排序 组合,英文名为Combination,是指从某元素集合中仅仅取出指定个数的元素,不考虑 ...
- 【组合数学】指数生成函数 ( 指数生成函数求解多重集排列示例 2 )
文章目录 一.指数生成函数求解多重集排列示例 2 参考博客 : 按照顺序看 [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相 ...
- 【组合数学】指数生成函数 ( 指数生成函数求解多重集排列示例 )
文章目录 一.指数生成函数求解多重集排列示例 参考博客 : 按照顺序看 [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相关 ...
- 【组合数学】指数生成函数 ( 证明指数生成函数求解多重集排列 )
文章目录 一.证明指数生成函数求解多重集排列 参考博客 : 按照顺序看 [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相关 ...
- 【组合数学】指数生成函数 ( 指数生成函数性质 | 指数生成函数求解多重集排列 )
文章目录 一.指数生成函数性质 二.指数生成函数求解多重集排列 参考博客 : 按照顺序看 [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | ...
- 【组合数学】排列组合 ( 多重集排列 | 多重集全排列 | 多重集非全排列 所有元素重复度大于排列数 | 多重集非全排列 某些元素重复度小于排列数 )
文章目录 一.多重集 二.多重集全排列 三.多重集全排列示例 三.多重集非全排列 1 所有元素重复度大于排列数 ( ni≥rn_i \geq rni≥r ) 四.多重集非全排列 2 某些元素重复度小 ...
- 快乐地打牢基础(13)——普通型母函数和指数型母函数的应用
母函数就是一列用来展示一串数字的挂衣架. --赫伯特·唯尔夫 . 一.普通型母函数 1.定义 对于任意数列 a 0 , a 1 , a 2 . . . a n a_0,a_1,a_2...a_n a0 ...
- hdu1521 指数型母函数
排列组合 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- 【组合数学】集合的排列组合问题示例 ( 排列 | 组合 | 圆排列 | 二项式定理 )
文章目录 一.集合排列 和 多重集排列问题 1 二. 集合排列 和 多重集排列问题 2 三. 找一一对应计算集合排列问题 ( 反向计算 ) 四. 圆排列问题 1 五. 集合交替排列问题 六. 圆排列问 ...
最新文章
- 应用程序进程(一):创建应用程序
- 5G NGC — 关键技术 — R15 SBA
- YOLO3实现目标检测(VS2015+OPENCV3.4.2+YOLO3+CUDA10.0+CUDNN7.5)
- ubuntu下查询SSH状态和安装SSH服务
- 基于FPGA的直流电机PWM控制+毕业论文
- 08、单链表编程考点
- 微型计算机生产制约因素,精品解析:广东省东莞市2019-2020学年高三下学期第一次统考(5月)模拟考试文科综合地理试题...
- 基于JAVA+SpringMVC+Mybatis+MYSQL的漫画社区
- 文本分类(一)封装分词器
- Spring Cloud Stream与RabbitMQ 死信队列
- 观点 PK | 商用 PC or 消费 PC,开发者究竟该如何取舍?
- 图片列表模板 html代码,图片列表模板
- gulp + angular + requirejs 简单学习
- ACS被集成到了Windows Azure Management Portal中
- 果然有人向吾了解如果改进doubango的问题
- 网络继电器的EPICS IOC搭建
- 上传,修改头像的使用
- 热血传奇服务端源代码分析笔记
- 深度分析:OA产品的技术发展过程及未来趋势
- ES数据库重建索引——Reindex(数据迁移)
热门文章
- UWP: 通过命令行启动 UWP 应用
- uwp浏览器java源码_从网站打开UWP应用程序
- 手动揪出电脑中毒导致的空间自动发广告的元凶
- Vmware workstation 16pro解锁装MacOS
- Windows使用ROS机器人操作系统12记录
- 天空之城用计算机弹歌,原神琴谱天空之城怎么弹?天空之城琴谱一览
- csharp基础练习题:卡塔劳尔【难度:1级】--景越C#经典编程题库,不同难度C#练习题,适合自学C#的新手进阶训练
- cidr计算器android,JavaScript 实现 CIDR 详细信息计算
- 电容之超级电容简易测试方法
- android 家庭监控,最好的三款家庭安防智能监控APP