指数型生成函数。做这题时,回去看看组合数学才知道,指数生成函数求的就是多重集合的r排列数。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #define N 15
  5.  
  6. using namespace std;
  7.  
  8. struct PQ{
  9. int p,q;
  10. };
  11.  
  12. PQ c1[N],c2[N];
  13. int num[N];
  14. PQ cal;
  15. int Q[N];
  16.  
  17. int gcd(int a,int b){
  18. if(b==0) return a;
  19. return gcd(b,a%b);
  20. }
  21.  
  22. PQ addsum(PQ a,PQ b){
  23. PQ tmp;
  24. tmp.q=a.q*b.q;
  25. tmp.p=a.p*b.q+a.q*b.p;
  26. int g=gcd(max(tmp.p,tmp.q),min(tmp.p,tmp.q));
  27. tmp.p/=g; tmp.q/=g;
  28. return tmp;
  29. }
  30.  
  31. int main(){
  32. int n,m,ptmp,qtmp;
  33. Q[0]=1;
  34. for(int i=1;i<N;i++)
  35. Q[i]=Q[i-1]*i;
  36. while(scanf("%d%d",&n,&m)!=EOF){
  37. for(int i=1;i<=n;i++)
  38. scanf("%d",&num[i]);
  39. for(int i=0;i<N;i++){
  40. c1[i].p=c2[i].p=0;
  41. c1[i].q=c2[i].q=1;
  42. }
  43. for(int i=0;i<=num[1];i++)
  44. c1[i].p=1,c1[i].q=Q[i];
  45. for(int i=2;i<=n;i++){
  46. for(int j=0;j<N;j++){
  47. for(int k=0;k+j<N&&k<=num[i];k++){
  48. ptmp=1,qtmp=Q[k];
  49. cal.p=ptmp*c1[j].p;cal.q=qtmp*c1[j].q;
  50. ptmp=gcd(max(cal.p,cal.q),min(cal.p,cal.q));
  51. cal.p/=ptmp; cal.q/=ptmp;
  52. c2[k+j]=addsum(cal,c2[k+j]);
  53. }
  54. }
  55. for(int j=0;j<N;j++)
  56. c1[j]=c2[j],c2[j].p=0,c2[j].q=1;
  57. }
  58. printf("%d\n",c1[m].p*Q[m]/c1[m].q);
  59. }
  60. return 0;
  61. }

  

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. BA--空调系统一次泵和二次泵区别

    通常来说,空调系统是按照满负荷设计的,但实际运行中,满负荷运行的 时间不足 3% ,空调设备绝大部分时间内在远低于额定负荷的情况下运转.在 部分负荷下,虽然冷水机组可以根据实际负荷调节相应的冷量输出, ...

  2. 双向链表的实现与操作(C语言实现)

    双向链表也叫双链表,是链表的一种,它的每一个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的随意一个结点開始,都能够非常方便地訪问它的前驱结点和后继结点. 单链表的局限 1.单 ...

  3. Java Pattern Matcher 正则表达式需要转义的字符

    见:http://blog.csdn.net/bbirdsky/article/details/45368709 /** * 转义正则特殊字符 ($()*+.[]?\^{},|) * * @param ...

  4. 16进制颜色字符串转为UIColor

    //16进制颜色(html颜色值)字符串转为UIColor +(UIColor *) hexStringToColor: (NSString *) stringToConvert {      NSS ...

  5. 12. mysql show status

    状态名 作用域 详解 Aborted_clients Global 因为client没有正确关闭连接导致client终止而中断的连接数 Aborted_connects Global 试图连接到MyS ...

  6. 疯狂Java学习笔记(72)-----------大话程序猿面试

    大话程序猿面试 10个我最喜欢问程序猿的面试问题 程序猿面试不全然指南 10个经典的C语言面试基础算法及代码 程序猿的10大成功面试技巧 程序猿选择公司的8个标准 编程开发 8个值得关注的PHP安全函 ...

  7. 2015.04.21,外语,读书笔记-《Word Power Made Easy》 12 “如何奉承朋友” SESSION 32

    TEASER PREVIEW 如何描述这些人: 很友好.容易相处的人: 不知疲倦的人: 简单.直率..aboveboard([ə'bʌv'bɔ:d] adv. 光明正大地, 率直地 adj. 光明正大 ...

  8. 风暴英雄 http 302重定向 正在等待游戏模式下载完成

    抓包 在抓到的数据包里面,看到一个http get请求,右键选中,然后follow stream wireshark自动进行数据包过滤tcp.stream eq 1340,并且可以看到完整的数据通讯 ...

  9. 【POJ 1733】 Parity Game

    [题目链接] http://poj.org/problem?id=1 [算法] 并查集 [代码] #include <algorithm> #include <bitset> ...

  10. Linux就该这么学 20181009(第十二章 SAMBA)

    参考链接https://www.linuxprobe.com Samba 跨平台的文件共享 linux-linux linux-windows /etc/samba/smb.conf 里面 []这个名 ...