指数型生成函数。做这题时,回去看看组合数学才知道,指数生成函数求的就是多重集合的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;
}

  

最新文章

  1. 查看APK方法数的工具dex-method-counts
  2. pip怎样用上豆瓣镜像
  3. 一行代码解释.net事件与委托
  4. json学习系列(8)JSON与JAVA数据的相互转换实例
  5. MATLAB 编程风格指南及注意事项
  6. 使用DNSPod来处理网站的均衡负载(转)
  7. MongoDB 性能优化五个简单步骤
  8. spring autoWire注解
  9. DB2创建序列
  10. C#利用lambda表达式将函数作为参数或属性跨类传递
  11. GDataXML的配置和使用
  12. (hdu step 7.1.5)Maple trees(凸包的最小半径寻找掩护轮)
  13. 解决 jQuery.UI.Resizable aspectRatio在init后无法重新设置
  14. google的作恶与不作恶
  15. Qt之操作系统环境
  16. 自适应的tab菜单栏
  17. 安装cocoaPods第三方类库
  18. (cvpr2019) The Degradation Model and Solution of DPSR
  19. mybatis框架(3)---SqlMapConfig.xml解析
  20. python(二)——list、字典、字符串操作

热门文章

  1. CAD教程----圆的优化命令viewres
  2. shell脚本监测文件变化
  3. UIButton上字体的对齐方式
  4. 关于ZipOupputStream添加压缩包常见问题
  5. comp.lang.javascript FAQ [zz]
  6. struts2-action中使用通配符
  7. js最简单的-点击小图放大
  8. RTSP/RTP 媒体传输和控制协议
  9. windows 下安装 php-memcached 扩展
  10. vue项目踩坑-引入bootstrap