1005: [HNOI2008]明明的烦恼

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 4981  Solved: 1941

Description

  自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在
任意两点间连线,可产生多少棵度数满足要求的树?

Input

  第一行为N(0 < N < = 1000),
接下来N行,第i+1行给出第i个节点的度数Di,如果对度数不要求,则输入-1

Output

  一个整数,表示不同的满足要求的树的个数,无解输出0

Sample Input

3
1
-1
-1

Sample Output

2

HINT

  两棵树分别为1-2-3;1-3-2

Source

【分析】

  先特判无解的情况。

  假设$sum=\sum(d[i]-1)|[d[i]!=-1]$

  $ss=\sum 1 [d[i]!=-1]$

  则$Ans=C_{n-2}^{sum}*\dfrac{sum!}{\Pi(d[i]-1)!}*(n-ss)^{n-2-sum}$

  即$Ans=\dfrac{(n-2)!}{(n-2-sum)!*\Pi(d[i]-1)!}*(n-ss)^{n-2-sum}$

  这些数值都不会超过n的,先手动消因子,然后Ans用高精度,就是高精乘单精。

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. using namespace std;
  7. #define Maxn 1010
  8. #define mod 10000
  9.  
  10. int cnt[Maxn],d[Maxn];
  11.  
  12. struct hugeint
  13. {
  14. int w[Maxn],l;
  15. hugeint() {memset(w,,sizeof(w));l=;}
  16. friend hugeint operator * (hugeint x,int y)
  17. {
  18. for(int i=;i<=x.l;i++) x.w[i]*=y;
  19. for(int i=;i<=x.l;i++) x.w[i+]+=x.w[i]/mod,x.w[i]%=mod;
  20. while(x.w[x.l+]!=) x.w[x.l+]+=x.w[x.l+]/mod,x.w[++x.l]%=mod;
  21. while(x.w[x.l]==&&x.l>) x.l--;
  22. return x;
  23. }
  24. };
  25.  
  26. void cal(int x,int y)
  27. {
  28. for(int i=;i<=x*x;i++) if(x%i==)
  29. {
  30. while(x%i==) cnt[i]+=y,x/=i;
  31. }
  32. if(x!=) cnt[x]+=y;
  33. }
  34.  
  35. int main()
  36. {
  37. int n;
  38. scanf("%d",&n);
  39. for(int i=;i<=n;i++) scanf("%d",&d[i]);
  40. if(n==&&d[]>) printf("0\n");
  41. else
  42. {
  43. int sum=,ss=;
  44. for(int i=;i<=n;i++) if(d[i]!=-) sum+=d[i]-,ss++;
  45. else if(d[i]==||d[i]>=n) {printf("0\n");return ;}
  46. if(sum>n-) printf("0\n");
  47. else
  48. {
  49. // for(int i=1;i<=n;i++) if(d[i]!=-1) d[i]--;
  50. for(int i=;i<=n;i++) cnt[i]=;
  51. for(int i=;i<=n-;i++) cal(i,);
  52. for(int i=;i<=n--sum;i++) cal(i,-);
  53. for(int i=;i<=n;i++) if(d[i]!=-)
  54. {
  55. for(int j=;j<=d[i]-;j++) cal(j,-);
  56. }
  57. cal(n-ss,n--sum);
  58. hugeint ans;ans.w[]=;
  59. for(int i=;i<=n;i++) while(cnt[i]--) ans=ans*i;
  60. printf("%d",ans.w[ans.l]);
  61. for(int i=ans.l-;i>=;i--) printf("%04d",ans.w[i]);printf("\n");
  62. }
  63. }
  64. return ;
  65. }

2017-04-25 15:36:48

【BZOJ 1005】 1005: [HNOI2008]明明的烦恼 (prufer数列+高精度)的更多相关文章

  1. BZOJ 1005 [HNOI2008]明明的烦恼 ★(Prufer数列)

    题意 N个点,有些点有度数限制,问这些点可以构成几棵不同的树. 思路 [Prufer数列] Prufer数列是无根树的一种数列.在组合数学中,Prufer数列是由一个对于顶点标过号的树转化来的数列,点 ...

  2. 【bzoj1005】[HNOI2008]明明的烦恼 Prufer序列+高精度

    题目描述 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? 输入 第一行为N(0 < N < = 1000),接下来N行,第i+1行给出第i ...

  3. [bzoj1005][HNOI2008]明明的烦恼-Prufer编码+高精度

    Brief Description 给出标号为1到N的点,以及某些点最终的度数,允许在 任意两点间连线,可产生多少棵度数满足要求的树? Algorithm Design 结论题. 首先可以参考这篇文章 ...

  4. bzoj 1005: [HNOI2008]明明的烦恼 prufer编号&&生成树计数

    1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2248  Solved: 898[Submit][Statu ...

  5. BZOJ 1005 [HNOI2008]明明的烦恼 (Prufer编码 + 组合数学 + 高精度)

    1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5786  Solved: 2263[Submit][Stat ...

  6. bzoj 1005 [HNOI2008] 明明的烦恼 (prufer编码)

    [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5907  Solved: 2305[Submit][Status][Di ...

  7. 【BZOJ 1005】[HNOI2008]明明的烦恼(暴力化简法)

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1005 [题意] 中文题 [题解] 一棵节点上标有序号的树会和一个prufer数列唯一对 ...

  8. BZOJ.1005.[HNOI2008]明明的烦恼(Prufer 高精 排列组合)

    题目链接 若点数确定那么ans = (n-2)!/[(d1-1)!(d2-1)!...(dn-1)!] 现在把那些不确定的点一起考虑(假设有m个),它们在Prufer序列中总出现数就是left=n-2 ...

  9. 【BZOJ 1005】[HNOI2008]明明的烦恼(化简的另一种方法)

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1005 [题意] [题解] 题目和题解在上一篇; 这里 对 [(m^(n-2-tot)) ...

  10. 【BZOJ 1005】[HNOI2008]明明的烦恼

    Description 自从明明学了树的结构,就对奇怪的树产生了兴趣...... 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为 ...

随机推荐

  1. css原生变量var()

    了解css/css3原生变量var 阮一峰css变量教程 深入学习css自定义属性(css变量)

  2. ZSTU OJ 3770: 黑帽子 归纳总结

    Description 一群非常聪明的人开舞会,每人头上都戴着一顶帽子.帽子只有黑白两种,黑的至少有一顶.每个人都能看到其它人帽子的颜色,却看不到自己的.主持人先让大家 看看别人头上戴的是什幺帽子,然 ...

  3. JMS学习(三)ActiveMQ Message Persistence

    1,JMS规范支持两种类型的消息传递:persistent and non-persistent.ActiveMQ在支持这两种类型的传递方式时,还支持消息的恢复.中间状态的消息(message are ...

  4. [转载]TypeScript 入门指南

    之前有听过,但未使用过,而最近在用nodejs,angularjs做一些前端项目,想到了这个来,正是学习TypeScript的时候,看介绍貌似和coffeescript相似,也JavaScript的转 ...

  5. Chrome插件LiveStyle结合Sublime Text3编辑器实现高效可视化开发

    LiveStyle是Chrome中提高开发效率的一款CSS编辑器插件.利用LiveStyle和Sublime Text3编辑器结合可实现可视化开发,一次配置,简单易用! 本文由前端交流QQ群管理员—— ...

  6. iOS编码规范参考

    目录      注释 1.1  多行注释 1.2  单行注释 1.3  函数的注释   命名 2.1  常量的命名 2.2  函数的命名 2.3  变量的命名 2.3.1  成员变量 2.3.2  公 ...

  7. mongodb导出数据csv格式

    mongoexport -d test -c item --type=csv -f salary,city,workYear,companyShortName -o user.csvmongoexpo ...

  8. 用《舌尖2》去理解C#中的多态和开闭原则

    昨天晚上看了<舌尖上的中国2>第一集,特别的感人,尤其是看到帮别人割麦子的麦客,一亩地开价200,雇主只肯给100,脸上的那种纠结和无可奈何.还有长着大眼睛的跳跳鱼,很可爱,不过最终还是被 ...

  9. Linux系统基本命令

    要区分大小写 uname 显示版本信息(同win2K的 ver) dir 显示当前目录文件 ls -al 显示包括隐藏文件(同win2K的 dir) pwd 查询当前所在的目录位置 cd .. 回到上 ...

  10. va_start(),va_end()函数应用【转】

    转自:http://www.cnblogs.com/gogly/articles/2416833.html 原理解释: VA_LIST 是在C语言中解决变参问题的一组宏,在<stdarg.h&g ...