当前位置: 首页 > news >正文

HDU1521 排列组合(指数生成函数)

指数型生成函数(Exponential Generating Function, EGF)

一、EGF 的定义

对于一个序列
[a0,a1,a2,a3,…][a_0, a_1, a_2, a_3, \dots][a0,a1,a2,a3,]
指数型生成函数(EGF) 定义为:

G(x)=∑n=0∞anxnn!G(x) = \sum_{n=0}^{\infty} a_n \frac{x^n}{n!} G(x)=n=0ann!xn

对比普通生成函数(OGF):

OGF: F(x)=∑anxn⟺EGF: G(x)=∑anxnn!\text{OGF: } F(x) = \sum a_n x^n \quad\Longleftrightarrow\quad \text{EGF: } G(x) = \sum a_n \frac{x^n}{n!} OGF: F(x)=anxnEGF: G(x)=ann!xn

区别:EGF 中每项系数多了一个 1n!\frac{1}{n!}n!1


二、EGF 的核心意义

  • OGF:用于无序组合(只考虑选取,不考虑顺序)。
  • EGF:用于有序排列(考虑顺序的情况)。

EGF 能自然地处理排列问题中出现的 1n!\frac{1}{n!}n!1 因子,
非常适合用于涉及标号、排列、顺序的计数问题。


题目要求:

nnn 种物品,第 iii 种有 aia_iai 个。
要从中选出 mmm 个物品进行排列(顺序不同算不同),求不同排列的总数。


数学建模

设选取第 iii 种物品 xix_ixi 个,则:

x1+x2+⋯+xn=m,0≤xi≤aix_1 + x_2 + \cdots + x_n = m, \quad 0 \le x_i \le a_i x1+x2++xn=m,0xiai

每种选择对应的排列数为:

m!x1!,x2!⋯xn!\frac{m!}{x_1! , x_2! \cdots x_n!} x1!,x2!xn!m!


生成函数表示

每种物品的 EGF 为:

fi(x)=1+x1!+x22!+⋯+xaiai!f_i(x) = 1 + \frac{x}{1!} + \frac{x^2}{2!} + \cdots + \frac{x^{a_i}}{a_i!} fi(x)=1+1!x+2!x2++ai!xai

所有物品的总生成函数为:

F(x)=∏i=1nfi(x)F(x) = \prod_{i=1}^{n} f_i(x) F(x)=i=1nfi(x)

取出 xmx^mxm 的系数:

[xm]F(x)=∑x1+⋯+xn=m1x1!x2!⋯xn![x^m] F(x) = \sum_{x_1+\cdots+x_n=m} \frac{1}{x_1!x_2!\cdots x_n!} [xm]F(x)=x1++xn=mx1!x2!xn!1

因此答案为:

Answer=m!×[xm]F(x)\text{Answer} = m! \times [x^m] F(x) Answer=m!×[xm]F(x)


四、代码解析与 EGF 对应

核心初始化部分:

for (int i = 1; i <= n; i++) cin >> a[i];
memset(c, 0, sizeof(c));
memset(d, 0, sizeof(d));
for (int i = 0; i <= a[1]; i++) c[i] = inv[i]; // 初始化第一种物品

🔹 含义 1:初始化第一个 EGF

inv[i] = 1 / i!
因此:

c[i]=1i!c[i] = \frac{1}{i!} c[i]=i!1

表示第 1 种物品的生成函数:

f1(x)=∑k=0a1xkk!f_1(x) = \sum_{k=0}^{a_1} \frac{x^k}{k!} f1(x)=k=0a1k!xk


接下来的循环:

for (int i=2; i<=n; i++) {for (int j=0; j<=m; j++) {for (int k=0; k<=a[i]; k++) {d[j+k] += c[j] * inv[k];}}for (int j=0; j<=m; j++) c[j]=d[j],d[j]=0;
}

含义 2:EGF 卷积(生成函数乘法)

每次乘入一个新的物品生成函数:

c(x)←c(x)×fi(x)c(x) \leftarrow c(x) \times f_i(x) c(x)c(x)×fi(x)

展开即:

d[j+k]=∑c[j]⋅1k!d[j+k] = \sum c[j] \cdot \frac{1}{k!} d[j+k]=c[j]k!1

表示求 Fi−1(x)⋅fi(x)F_{i-1}(x) \cdot f_i(x)Fi1(x)fi(x) 的系数卷积。

最终 c[m] 存放的就是 [xm]F(x)[x^m] F(x)[xm]F(x)


最后一步:

ll res = c[m] * fac[m] % mod;

🔹 含义 3:乘上 m!m!m!

根据公式:

Answer=m!⋅[xm]F(x)\text{Answer} = m! \cdot [x^m] F(x) Answer=m![xm]F(x)

所以最终结果就是排列总数。


五、数学与代码对应表

数学表达式程序变量 / 操作含义
fi(x)=∑k=0aixkk!f_i(x) = \sum_{k=0}^{a_i}\frac{x^k}{k!}fi(x)=k=0aik!xkinv[k]预存 1/k!1/k!1/k!
F(x)=∏fi(x)F(x) = \prod f_i(x)F(x)=fi(x)c[]当前生成函数的系数
卷积:d[j+k]+=c[j]⋅1k!d[j+k]+=c[j]\cdot\frac{1}{k!}d[j+k]+=c[j]k!1双重循环实现乘法
取系数 [xm]F(x)[x^m]F(x)[xm]F(x)c[m]mmm 项系数
m!m!m!fac[m]*c[m]输出排列数

六、EGF 与 OGF 的区别总结

对比项普通生成函数 (OGF)指数生成函数 (EGF)
定义F(x)=∑anxnF(x)=\sum a_nx^nF(x)=anxnG(x)=∑anxnn!G(x)=\sum a_n\frac{x^n}{n!}G(x)=ann!xn
应用场景组合数(无序选取)排列数(有序选取)
系数含义子集数量带顺序排列数
乘法含义集合并带标号排列

七、最终总结

这道题的核心数学思想是:

F(x)=∏i=1n(∑k=0aixkk!)F(x) = \prod_{i=1}^{n}\left(\sum_{k=0}^{a_i}\frac{x^k}{k!}\right) F(x)=i=1n(k=0aik!xk)

答案为:

Answer=m!⋅[xm]F(x)\boxed{\text{Answer} = m! \cdot [x^m] F(x)} Answer=m![xm]F(x)

你的代码正是这个公式的实现:
利用数组 c[] 存储 EGF 系数,逐步做卷积,最后乘上 m!m!m!


题目链接

题解

#include <bits/stdc++.h>
using namespace std;
const int N=1e2+10;
const int mod = 998244353;
typedef long long ll;
int n,m;
ll a[N];
ll c[N],d[N];
ll fac[N];
ll inv[N];
ll qpow(ll a,ll b,ll p)
{ll res = 1;for(;b;b>>=1){if(b&1)res = res*a%p;a = a*a%p;}return res;}void solve()
{for(int i=1;i<=n;i++){cin>>a[i];}memset(c,0,sizeof(c));memset(d,0,sizeof(d));for(int i=0;i<=a[1];i++)c[i]=inv[i];for(int i=2;i<=n;i++){for(int j=0;j<=m;j++){for(int k=0;k<=a[i]&&j+k<=m;k++){d[j+k]+=(c[j]*inv[k])%mod;d[j+k]%=mod;}}for(int j=0;j<=m;j++)c[j]=d[j],d[j]=0;}ll res = c[m]*fac[m]%mod;cout<<res<<endl;}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;fac[0]=inv[0]=1;for(int i=1;i<=100;i++){fac[i]=fac[i-1]*i%mod;inv[i]=qpow(fac[i],mod-2,mod);// cout<<fac[i]<<' '<<inv[i]<<endl;}// cin>>t;while(cin>>n>>m){solve();}return 0;
}
http://www.dtcms.com/a/570967.html

相关文章:

  • 网站seo教材哪里可以免费下载ppt模板
  • 网站要素的优化设计网站seo关键词
  • 广东公园网站建设代理公司网站备案 超链接
  • 简单的网站代码黄浦网站设计
  • php网站开发结构html家乡网站设计模板
  • 网站开发开发优势网上书城网站建设总结
  • 【IC】NoC设计入门 -- 路由逻辑
  • No052:耐心的修行——当DeepSeek学会在时间中孕育智慧
  • SAP PCE中直接使用移动类412或414做E库存调整导致物料分类账差异无法分摊
  • Halcon实战:精准定位与提取:基于形态学处理的猴子眼睛区域检测完整方案
  • 以net结尾的网站闵行区网站制作
  • 潍坊中脉网站建设站长工具查询域名
  • 北京网站建设首选优达种植园网站模板
  • 胶州网站设计公司wordpress删除缓存会删掉文件吗
  • 海外网站哪个最好深圳家居网站建设公司排名
  • 南京做网站建设搭建的公司一级建造师考试科目
  • 邢台网站开发vscode网页设计教程
  • 如何建立网站?可以分为( )
  • MySQL安装卸载与数据库操作指南
  • 代码随想录-day26
  • PortSwigger靶场之盲 SSRF(服务器端请求伪造)漏洞通关秘籍
  • 送菜网站制作中国煤炭建设协会网站
  • wordperss网站做负载均衡新闻发稿计划怎么写
  • 360个人网站怎么推广郑州网站制作-中国互联
  • 肯德基网站是哪家公司做的长春网站建设找源晟
  • 深圳最好的营销网站建设公司设计公司网站
  • 兰州网站建设q479185700惠软件商店oppo官方下载
  • 企业网站的规划与设计网页搜索快捷键是什么
  • 做门户网站建设多少钱网络创始人 网站建设
  • 网站服务器建设合同北京市建设投标网站