HDU 1521
2024-08-31 08:36:06
指数型生成函数。做这题时,回去看看组合数学才知道,指数生成函数求的就是多重集合的r排列数。
#include <iostream>
#include <cstdio>
#include <algorithm>
#define N 15 using namespace std; struct PQ{
int p,q;
}; PQ c1[N],c2[N];
int num[N];
PQ cal;
int Q[N]; int gcd(int a,int b){
if(b==0) return a;
return gcd(b,a%b);
} PQ addsum(PQ a,PQ b){
PQ tmp;
tmp.q=a.q*b.q;
tmp.p=a.p*b.q+a.q*b.p;
int g=gcd(max(tmp.p,tmp.q),min(tmp.p,tmp.q));
tmp.p/=g; tmp.q/=g;
return tmp;
} int main(){
int n,m,ptmp,qtmp;
Q[0]=1;
for(int i=1;i<N;i++)
Q[i]=Q[i-1]*i;
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
for(int i=0;i<N;i++){
c1[i].p=c2[i].p=0;
c1[i].q=c2[i].q=1;
}
for(int i=0;i<=num[1];i++)
c1[i].p=1,c1[i].q=Q[i];
for(int i=2;i<=n;i++){
for(int j=0;j<N;j++){
for(int k=0;k+j<N&&k<=num[i];k++){
ptmp=1,qtmp=Q[k];
cal.p=ptmp*c1[j].p;cal.q=qtmp*c1[j].q;
ptmp=gcd(max(cal.p,cal.q),min(cal.p,cal.q));
cal.p/=ptmp; cal.q/=ptmp;
c2[k+j]=addsum(cal,c2[k+j]);
}
}
for(int j=0;j<N;j++)
c1[j]=c2[j],c2[j].p=0,c2[j].q=1;
}
printf("%d\n",c1[m].p*Q[m]/c1[m].q);
}
return 0;
}
最新文章
- 查看APK方法数的工具dex-method-counts
- pip怎样用上豆瓣镜像
- 一行代码解释.net事件与委托
- json学习系列(8)JSON与JAVA数据的相互转换实例
- MATLAB 编程风格指南及注意事项
- 使用DNSPod来处理网站的均衡负载(转)
- MongoDB 性能优化五个简单步骤
- spring autoWire注解
- DB2创建序列
- C#利用lambda表达式将函数作为参数或属性跨类传递
- GDataXML的配置和使用
- (hdu step 7.1.5)Maple trees(凸包的最小半径寻找掩护轮)
- 解决 jQuery.UI.Resizable aspectRatio在init后无法重新设置
- google的作恶与不作恶
- Qt之操作系统环境
- 自适应的tab菜单栏
- 安装cocoaPods第三方类库
- (cvpr2019) The Degradation Model and Solution of DPSR
- mybatis框架(3)---SqlMapConfig.xml解析
- python(二)——list、字典、字符串操作