题解

首先我们要知道一条性质,prufer序列中的某个点出现次数为该点在树中度数-1

感性理解一下,其实按照prufer序列求法自己推一下就出来了

设题目里给的度为$d[]$

先将所有的d--

然后按照排列组合得出来

这是多重集排列数

首先从n-2中选择d[1]个数是$C_{n}^{d[1]}$然后再从剩余n-d[1]中选d[2] $C_{n-d[1]}^{d[2]}$依次类推

$C_{n-2}^{d[1]}\times C_{n-2-d[1]}^{d[2]}\times C_{n-2-d[1]-d[2]}^{d[3]}\times ……\times C_{n-2-d[1]-……-d[n-1]}^{d[n]}$

得到

$\frac{(n-2)!}{\sum\limits_{i=1}^{n}d[i]!}$

高精转移就完了

还是过不了?

一些特判:

首先该题会有无解的情况

然后当只有一个点时方案数为1

然后当出现度数为0的点时方案数要特殊处理

以下是本人丑陋的代码

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define N 10
  4. #define P 1
  5. using namespace std;
  6. ll n,m,d[20000],cnt=0;
  7. bool flag[20000];
  8. struct bignum
  9. {
  10. ll n[200000],l;
  11. bignum(){l=1,memset(n,0,sizeof(n));}
  12. void clear(){while(l>1&&!n[l-1]) l--;}
  13. void print()
  14. {
  15. printf("%lld",n[l-1]);
  16. for(ll i=l-2;i>=0;i--)
  17. printf("%0*lld",P,n[i]);
  18. printf("\n");
  19. }
  20. bignum operator = (ll x)
  21. {
  22. l=0;
  23. while(x)
  24. {
  25. n[l++]=x%N;
  26. x/=N;
  27. }
  28. return *this;
  29. }
  30. bignum operator +(bignum x) const
  31. {
  32. bignum t=*this;
  33. if(x.l>t.l) t.l=x.l;
  34. for(ll i=0;i<t.l;i++)
  35. {
  36. t.n[i]+=x.n[i];
  37. if(t.n[i]>=N)
  38. {
  39. t.n[i+1]+=t.n[i]/N;
  40. t.n[i]%=N;
  41. }
  42. }
  43. return t;
  44. }
  45. bignum operator * (const ll& b)
  46. {
  47. bignum c;
  48. c.l=0;
  49. for(ll i=0,g=0;g||i<l;i++)
  50. {
  51. ll x;
  52. if(i<l)x=n[i]*b+g;
  53. else x=g;
  54. c.n[c.l++]=x%N;
  55. g=x/N;
  56. }
  57. return c;
  58. }
  59. bignum operator *(bignum x) const
  60. {
  61. bignum t=*this,tep;
  62. tep.l=t.l+x.l+1;
  63. for(ll i=0;i<t.l;i++)
  64. for(ll j=0;j<=x.l;j++)
  65. {
  66. tep.n[i+j]+=t.n[i]*x.n[j];
  67. }
  68. for(ll i=0;i<tep.l;i++)
  69. {
  70. tep.n[i+1]+=tep.n[i]/N;
  71. tep.n[i]%=N;
  72. }
  73. tep.clear();
  74. return tep;
  75. }
  76. bool operator <(bignum x) const
  77. {
  78. bignum t=*this,tep;
  79. if(t.l!=x.l) return t.l<x.l;
  80. for(ll i=t.l-1;i>=0;i--)
  81. {
  82. if(t.n[i]!=x.n[i]) return t.n[i]<x.n[i];
  83. }
  84. return 0;
  85. }
  86. bool operator >(bignum x) const
  87. {
  88. bignum t=*this;
  89. if(t.l!=x.l) return t.l>x.l;
  90. for(ll i=t.l-1;i>=0;i--)
  91. {
  92. if(t.n[i]!=x.n[i]) return t.n[i]>x.n[i];
  93. }
  94. return 0;
  95. }
  96. bignum operator -(bignum x) const
  97. {
  98. bignum t=*this;
  99. if(t<x) printf("-"),swap(t,x);
  100. ll jie=0;
  101. for(ll i=0;i<t.l;i++)
  102. {
  103. t.n[i]-=x.n[i];
  104. while(t.n[i]<0)
  105. {
  106. t.n[i]+=N;
  107. jie++;
  108. }
  109. t.n[i+1]-=jie;
  110. jie=0;;
  111. }
  112. t.clear();
  113. return t;
  114. }
  115. bignum operator /(const ll &x)
  116. {
  117. bignum t=*this,r;
  118. ll tmp=0;
  119. r.l=t.l;
  120. for(ll i=t.l-1;i>=0;i--){
  121. tmp+=t.n[i];
  122. if(tmp>=x){
  123. r.n[i]=tmp/x;
  124. tmp%=x;
  125. }
  126. tmp*=N;
  127. }
  128. r.clear();
  129. return r;
  130. }
  131. }ans;
  132. bignum jie(ll x)
  133. {
  134. bignum t;t=1;
  135. for(ll i=2;i<=x;i++){
  136. t=x*i;
  137. }
  138. return t;
  139. }
  140. int main()
  141. {
  142. memset(flag,0,sizeof(flag));
  143. ll sum=0,you0=0;
  144. scanf("%lld",&n);
  145. for(ll i=1;i<=n;i++)
  146. {
  147. scanf("%lld",&d[i]);
  148. if(d[i])flag[i]=1,cnt++;
  149. else you0=1;
  150. d[i]--,sum+=d[i];
  151.  
  152. }
  153. if(you0&&n==1){
  154. cout<<1<<endl;
  155. return 0;
  156. }
  157. if(sum!=n-2||you0)
  158. {
  159. cout<<0<<endl;
  160. return 0;
  161. }
  162. ans=1;
  163. for(ll i=2;i<=cnt-2;i++)
  164. ans=ans*i;
  165. for(ll i=1;i<=n;i++){
  166. if(flag[i])
  167. for(ll j=2;j<=d[i];j++)
  168. ans=ans/j;
  169. }
  170. ans.print();
  171. }

树的计数(prufer序列 或 purfer序列)的更多相关文章

  1. 树的计数 + prufer序列与Cayley公式(转载)

    原文出处:https://www.cnblogs.com/dirge/p/5503289.html 树的计数 + prufer序列与Cayley公式 学习笔记(转载) 首先是 Martrix67 的博 ...

  2. 树的计数 + prufer序列与Cayley公式 学习笔记

    首先是 Martrix67 的博文:http://www.matrix67.com/blog/archives/682 然后是morejarphone同学的博文:http://blog.csdn.ne ...

  3. Luogu P2290 [HNOI2004]树的计数 Prufer序列+组合数

    最近碰了$prufer$ 序列和组合数..于是老师留了一道题:P2624 [HNOI2008]明明的烦恼 qwq要用高精... 于是我们有了弱化版:P2290 [HNOI2004]树的计数(考一样的可 ...

  4. 树的计数 Prufer序列+Cayley公式

    先安利一发.让我秒懂.. 第一次讲这个是在寒假...然而当时秦神太巨了导致我这个蒟蒻自闭+颓废...早就忘了这个东西了... 结果今天老师留的题中有两道这种的:Luogu P4981 P4430 然后 ...

  5. [HNOI2004]树的计数 prufer数列

    题面: 一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, d2, …, dn,你的程序需要输出满足d( ...

  6. bzoj1211: [HNOI2004]树的计数 prufer编码

    题目链接 bzoj1211: [HNOI2004]树的计数 题解 prufer序 可重排列计数 代码 #include<bits/stdc++.h> using namespace std ...

  7. BZOJ 1211 HNOI2004 树的计数 Prufer序列

    题目大意:给定一棵树中全部点的度数,求有多少种可能的树 Prufer序列.详细參考[HNOI2008]明明的烦恼 直接乘会爆long long,所以先把每一个数分解质因数.把质因数的次数相加相减.然后 ...

  8. 【BZOJ1005/1211】[HNOI2008]明明的烦恼/[HNOI2004]树的计数 Prufer序列+高精度

    [BZOJ1005][HNOI2008]明明的烦恼 Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可 ...

  9. 【BZOJ1211】【HNOI2004】树的计数 prufer序列

    题目描述 给你\(n\)和\(n\)个点的度数,问你有多少个满足度数要求的生成树. 无解输出\(0\).保证答案不超过\({10}^{17}\). \(n\leq 150\) 题解 考虑prufer序 ...

随机推荐

  1. 2021/5/11 docker的应用

    很快一天过去了,今天虽然没有加班,但是依旧感觉疲惫,弄了一天的docker镜像的问题.作为一名前端开发工程师从以前从未听说过docker到现在懂得了如何运用,也是不容易啊.之前也说过,我们项目结构是前 ...

  2. 『政善治』Postman工具 — 8、Postman中Pre-request Script的使用

    目录 1.Pre-request Script介绍 2.常用SNIPPETS(片段)说明 (1)获取变量脚本: (2)设置变量脚本: (3)清空变量脚本: (4)Send a request代码片段 ...

  3. 成功的多项目管理都有哪些"制胜之道"?

    实施多项目管理,一个重要原因就是提高项目的效率和管理水平.除了满足时间.成本.业绩和客户需求之外,项目管理办公室(PMO)经理的预期产出还包括有效利用组织资源.下面是影响多项目管理成功的几个关键因素, ...

  4. golang:面向对象总结

    所谓的面向对象其实就是找一个专门做这个事的人来做,不用关心具体怎么实现的.所以说,面向过程强调的是过程,步骤.而面向对象强调的是对象,也就是干事的人. Go语言:面向对象语言特性 方法 嵌入 接口 没 ...

  5. [bug] maven“1.5不支持diamond运算符,请使用source 7或更高版本以启用diamond运算符”

    原因 maven打包默认采用jdk 1.5,无法识别<> 解决 在pom.xml中加入: <properties> <maven.compiler.source>1 ...

  6. [Linux]常用命令、组合命令以及输入输出重定向

    [Linux]常用命令.组合命令以及输入输出重定向 2020-03-10阅读 1580   原创文章 文章目录 0.切换目录 1.复制文件和目录`cp` 1.1.复制文件 1.2.复制目录 1.3.扩 ...

  7. Linux巡检常用命令

    # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostn ...

  8. IT菜鸟之虚拟机VMware的安装

    老师说过,如果想学好Linux,最好不要在实体机上安装Linux,因为学习需要经常折腾,在实体机上做实验,出现故障就要重新安装,这样绝大多数时间都会浪费在安装上. 这时我们需要一个工具,它就是虚拟机. ...

  9. Linux中级之ansible概念及hoc命令行调用模式

    一.Ansible简介 ansible是新出现的开源的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统 ...

  10. shell基础之后台运行脚本

    使shell脚本后台执行,基本的方法有两种,第一种为在脚本后面追加&符号,第二种为在脚本前面使用nohup命令,结尾再追加&符号 一.后台运行脚本1 1.执行脚本test.sh:./t ...