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

  

HDU 1521的更多相关文章

  1. 排列组合 HDU - 1521 -指数型母函数

    排列组合 HDU - 1521 一句话区分指数型母函数和母函数就是 母函数是组合数,指数型母函数是排列数 #include<bits/stdc++.h> using namespace s ...

  2. hdu 1521 排列组合 —— 指数型生成函数

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1521 标准的指数型生成函数: WA了好几遍,原来是多组数据啊囧: 注意精度,直接强制转换(int)是舍去小 ...

  3. HDU 1521 排列组合 指数型母函数

    排列组合 Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status D ...

  4. Hdu 1521 排列组合

    a1 n1 a2 n2 ... ak nkn=n1+n2+...+nk从n个数中选r个排列(不是组合噢)// 指数型母函数// 模板#include <iostream> #include ...

  5. HDU 1521 排列组合 (母函数)

    题目链接 Problem Description 有n种物品,并且知道每种物品的数量.要求从中选出m件物品的排列数.例如有两种物品A,B,并且数量都是1,从中选2件物品,则排列有"AB&qu ...

  6. HDU 1521 指数型母函数

    方法一: DFS 方法二:生成函数 每个数可以重复一定次数,求排列组合数,这是裸的指数型生成函数: #include <bits/stdc++.h> using namespace std ...

  7. hdu 1521 排列组合【指数型生成函数】

    根据套路列出式子:\( \prod_{i=1}^{n}\sum_{j=0}^{c[i]}\frac{x^j}{j!} \),然后暴力展开即可 #include<iostream> #inc ...

  8. 母函数 <普通母函数(HDU - 1028 ) && 指数型母函数(hdu1521)>

    给出我初学时看的文章:母函数(对于初学者的最容易理解的) 普通母函数--------->HDU - 1028 例题:若有1克.2克.3克.4克的砝码各一 枚,能称出哪几种重量?各有几种可能方案? ...

  9. HDU——PKU题目分类

    HDU 模拟题, 枚举1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 ...

随机推荐

  1. jquery日历插件FullCalendar使用技巧

    原文链接:http://blog.csdn.net/u013493957/article/details/44920341   FullCalendar是一款基于jquery的日历控件,它有着很强大的 ...

  2. [Linux]第三部分-学习Shell和Shell脚本

    vim 高级的 vii o a 进入编辑模式 esc进入一般模式:wq离开alias vi='vim' 使用vim打开viv块选择 y复制反白,d删除反白在vi中打开一个文件后,可以使用 sp fil ...

  3. [SharePoint2010开发入门经典]编译部署SPS WebPart

    本章概要: 1.理解web部件,什么时候需要创建一个 2.理解标准和可视web部件的不同 3.使用VS构建部署web部件

  4. POJ 1950

    直接DFS,因为实在没想到什么剪枝了... 注意一点是,10.11使用的是1011哦 #include <iostream> #include <cstdio> #includ ...

  5. 前端 自定义format函数

    为字符串创建format方法,用于字符串格式化  {# 前端没有字符串占位符%s的替代方法,以下是自定义字符串替换的方法,以后前端拓展方法都可以使用下面的形式 #} String.prototype. ...

  6. angularjs1-6,自定义服务

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  7. Android获取系统时间的多种方法

    Android中获取系统时间有多种方法,可分为Java中Calendar类获取,java.util.date类实现,还有android中Time实现. 现总结如下: 方法一: ? 1 2 3 4 5 ...

  8. 27.Qt时钟

    myclock.h #ifndef MYCLOCK_H #define MYCLOCK_H #include <QObject> #include <QLCDNumber> # ...

  9. 完整注册+JQuery验证+selert后台校验

    Java代码 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8 ...

  10. Api接口服务的设计和安全解决方案

    这个涉及到两个方面问题:一个是接口访问认证问题,主要解决谁可以使用接口(用户登录验证.来路验证)一个是数据数据传输安全,主要解决接口数据被监听(HTTPS安全传输.敏感内容加密.数字签名) 普通网站应 ...