又是看黄学长的代码写的,估计我的整个BZOJ平推计划都要看黄学长的代码写

原题:

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

0 < N < = 1000

这题用到了树的prufer编码

prufer编码是什么呐

注意下面扯到的树都是无根树(下面不少定义是从黄学长哪里直接粘过来的)

每次删除树中度数为1且序号最小的节点,并在序列中添加与其相邻的节点的序号,直到树中有两个节点,手玩一组小数据很容易理解(逃

呢么任意一棵树都有唯一的长度为n-2的prufer编码,且度数为m的节点在编码中出现了m-1次

呢么就可以将编码还原回一棵树,从prufer编码的最前端开始扫描节点,设该节点序号为 u ,寻找不在prufer编码的最小序号且没有被标记的节点 v ,连接   u,v,并标记v,将u从prufer编码中删除。扫描下一节点。

题中已经把度数给了,呢么就用prufer编码解决

不会写数学表达式,直接粘黄学长的解释吧(sro_hzwer_orz)

题目很丧心病狂的没有让膜一个数,所以要高精度

然而如果用高精度除就亏了,因为这个式子求的是方法数,最后肯定是个整数,呢么就可以分解质因数然后加减,最后再高精度乘

高精度乘可以使用万进制优化,这里有个小技巧,scanf("%abd");表示输出b位数,不够的部分前面补a

因为高精度乘WA了5次,实力会随着时间的推移而减弱qaq

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cmath>
  6. using namespace std;
  7. int mo=;
  8. int n,a[];
  9. int m=,tot=;
  10. int zhi[],ztop=;
  11. bool kang[];
  12. int num[];
  13. int ans[],la=;
  14. void shai(){
  15. memset(kang,,sizeof(kang));
  16. for(int i=;i<=;i++)if(!kang[i]){
  17. zhi[++ztop]=i;
  18. int temp=;
  19. while(i*temp<=){
  20. kang[i*temp]=true;
  21. temp++;
  22. }
  23. }
  24. }
  25. void buff(int x,int y){//hzwer_orz,用一个参数可以将加和减的代码合并
  26. for(int i=;i<=x;i++){//阶乘
  27. int c=i;
  28. for(int j=;c>=zhi[j];j++)
  29. while(!(c%zhi[j])){
  30. num[j]+=y;
  31. c/=zhi[j];
  32. }
  33. }
  34. }
  35. void mul(int x){
  36. for(int i=;i<=la;i++) ans[i]*=x;
  37. for(int i=;i<=la;i++){
  38. ans[i+]+=ans[i]/mo;
  39. ans[i]%=mo;
  40. }
  41. while(ans[la+]){ la++; ans[la+]+=ans[la]/mo; ans[la]%=mo;}
  42. }
  43. int main(){
  44. //freopen("ddd.in","r",stdin);
  45. //freopen("bzoj_1005.in","r",stdin);
  46. //freopen("bzoj_1005.out","w",stdout);
  47. memset(num,,sizeof(num));
  48. shai();
  49. cin>>n;
  50. if(n==){
  51. scanf("%d",&a[]);//注意因为a要--,所以这个特判不能放下面
  52. if(!a[] || a[]==-) cout<<<<endl;
  53. else cout<<<<endl;
  54. return ;
  55. }
  56. for(int i=;i<=n;i++){
  57. scanf("%d",&a[i]);
  58. if(!a[i]){ cout<<<<endl; return ;}
  59. if(a[i]==-) m++;
  60. else a[i]--,tot+=a[i];
  61. }
  62. buff(n-,);
  63. buff(n--tot,-);
  64. for(int i=;i<=n;i++)if(a[i]) buff(a[i],-);
  65. ans[la=]=;
  66. for(int i=;i<=ztop;i++)
  67. while(num[i] --> )//趋向于
  68. //mul(num[i]);静态差错多重要?这是第二个傻逼错误了
  69. mul(zhi[i]);
  70. for(int i=;i<=n--tot;i++)
  71. mul(m);
  72. //for(int i=1;i<=la;i++) cout<<ans[i]<<" "; cout<<endl;
  73. cout<<ans[la];//之前写成最后输出ans[1] qaq
  74. for(int i=la-;i>=;i--) printf("%05d",ans[i]);//之前写成2到la了,实力会随着时间的推移而降低qaq,然后还是之前写成%04 qaq
  75. cout<<endl;
  76. //因为高精度乘WA了5次QAQ
  77. return ;
  78. }

【BZOJ1005】【HNOI2008】明明的烦恼的更多相关文章

  1. bzoj1005 [HNOI2008]明明的烦恼

    1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3032  Solved: 1209 Description ...

  2. bzoj1005: [HNOI2008]明明的烦恼(prufer+高精度)

    1005: [HNOI2008]明明的烦恼 题目:传送门 题解: 毒瘤题啊天~ 其实思考的过程还是比较简单的... 首先当然还是要了解好prufer序列的基本性质啦 那么和1211大体一致,主要还是利 ...

  3. [BZOJ1005] [HNOI2008] 明明的烦恼 (prufer编码)

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

  4. 【prufer编码+组合数学】BZOJ1005 [HNOI2008]明明的烦恼

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

  5. BZOJ1005 HNOI2008明明的烦恼(prufer+高精度)

    每个点的度数=prufer序列中的出现次数+1,所以即每次选一些位置放上某个点,答案即一堆组合数相乘.记一下每个因子的贡献分解一下质因数高精度乘起来即可. #include<iostream&g ...

  6. BZOJ1005:[HNOI2008]明明的烦恼(组合数学,Prufer)

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

  7. [bzoj1005][HNOI2008][明明的烦恼] (高精度+prufer定理)

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

  8. bzoj1005: [HNOI2008]明明的烦恼 prufer序列

    https://www.lydsy.com/JudgeOnline/problem.php?id=1005 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的 ...

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

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

  10. [BZOJ1005][HNOI2008]明明的烦恼 数学+prufer序列+高精度

    #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int N; ...

随机推荐

  1. JAVA之关于super的用法

    JAVA之关于super的用法   路漫漫其修远兮,吾将上下而求索.——屈原<离骚> 昨天写this用法总结的时候,突然产生了一个问题,请教别人之后,有了自己的一点认识.还是把它写下来,为 ...

  2. matlab图形句柄属性总结

    原文在于雪漫的bloghttp://blog.sina.com.cn/s/blog_4b9b714a0100cce2.html这两天在看句柄式图形方面的东西,以下是我在看书过程中整理的学习笔记,比较详 ...

  3. [Java]Java简介

    Java版本历史 1995年5月23日,Java语言诞生 1996年1月,第一个JDK1.0诞生 1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入JAVA技术 1996年9月,约8.3 ...

  4. ansible quick start

    1. ansible默认开启ControlPersist,也就是持续化ssh的socket连接,以跳过每次task都需要进行主机认证. 2. 但是centos的openssh版本太老了,不支持Cont ...

  5. 关押罪犯(noip2010)

    解法: (1)搜索(30分) (2)二分(此题属于最大值最小问题) (3)贪心+并查集 下面着重说一下“贪心+并查集” 因为有A.B两座监狱,每个犯人不是在A,就是在B监狱. 至于每个犯人在那个监狱, ...

  6. Moto G如何进入开发者选项

    最近买了个Moto G做应用开发,突然发现开发者选项居然没有,搜索了一下发现是Google隐藏了此选项. http://allaboutmotog.com/moto-g-how-to-guide/ac ...

  7. 数据库添加数据II及SQL语句错误

    前些时候,写的代码(数据库添加数据I),往数据库添加数据都是很基本的一条一条地添加.但是平常用于测试时,总不可能一条一条地添加测试数据吧,然后我就尝试着一次性添加几百上千条,但是再次操作的时候,就出问 ...

  8. PHP面向对象的程序设计一些简单的概念

    一.面向对象的概述    数组和对象,都属于PHP中的复合类型(一个变量可以存储多个单元) 对象比数组更强大,不仅可以存储多个数据,还可以将函数存在对象中 对象的三大特性:封装,继承,多态 面向对象编 ...

  9. 【LeetCode OJ】Populating Next Right Pointers in Each Node

    Problem Link: http://oj.leetcode.com/problems/populating-next-right-pointers-in-each-node/ Just trav ...

  10. BZOJ2661 连连看 (费用流)

    把所有点拆成两个,将符合条件的两个点x,y连上边,流量为1,费用为-(x+y). 做一遍最小费用最大流,最后ans div 2即可. Program bzoj2661; ; ..] of longin ...