指数生成函数
指数生成函数
定义:
加减运算:
卷积:
用处:不同于普通生成函数,指数生成函数用来解决多重集排列数问题。
HDU-1521 排列组合:
有 种物品,每种物品 个,问取 个物品的排列数?
设个每种物品中取 个,,,对于一组选定的 进行排列的方案数为 。意思是 的全排列去掉每一组中的重复。
例如取3个A、1个B的排列数为 ,即AAAB,AABA,ABAA,BAAA。
那么所有满足 的排列数之和,即答案。
构造指数生成函数:第1种物品的生成函数为 ,第 种物品的生成函数为 。
即
求 的系数。
做乘法:
做卷积,所有满足 的项的系数之和,再乘以 ,即为答案。
求系数的方法还是累加。需要预处理阶乘。
代码:
int n,m;
int a[11];
double fac[11];
double C[11],D[22];
void init(){//计算阶乘
fac[0]=fac[1]=1;
for(int i=2;i<=100;++i)
fac[i]=fac[i-1]*i;
}
double calc(){
for(int i=0;i<=m;++i) C[i]=D[i]=0;
for(int i=0;i<=a[1];++i) C[i]=1.0/fac[i];
for(int i=2;i<=n;++i){
//计算x^(j+k)的系数
for(int j=0;j<=m;++j)
for(int k=0;k<=a[i];++k)
D[j+k]+=C[j]/fac[k];
//转存C,清空D
for(int j=0;j<=m;++j)
C[j]=D[j], D[j]=0;
}
return C[m]*fac[m];
}
int main(){
init();
while(~scanf("%d%d",&n,&m)){
for(int i=1; i<=n; ++i)
scanf("%d",&a[i]);
printf("%.0lf\n",calc());
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现