题意

给出 \(n\) 和长度为 \(n\) 的数列 \(d\) 表示每个点的度数,问有多少颗满足要求的树。

分析

这题是prufer编码的应用。

prufer编码是对一个带标号无根树的刻画,生成方式是:对于一棵树,每次找到度数为1的编号最小的节点,把与这个节点相邻的那个节点加在生成数列后面,删除这个节点;进行这个过程直到树只剩下两个点。这样我们就生成了这棵树的prufer数列,长度为 \(n-2\) 。

反过来,一个prufer编码唯一对应一棵树,因为我们可以用prufer编码唯一对应回一棵树,因此构成双射。解码方法如下:对于 \(i=n-2\cdots 1\) ,找出在prufer序列中后 \(i\) 个数中没有出现过的而且没有用过的最小数 \(x\),加边 \((x,a_i)\) ,把 \(x\) 标记为用过。最后剩下的一个数直接连在最后一位上即可。很明显每次我们都能唯一确定这个数,因此可以唯一地连边。

这题的答案是

\[\frac{(n-2)!}{\prod _{i=1}^n(d_i-1)!}
\]

原因是每个点的度数为 \(d_i\) 就代表它在prufer数列中出现了 \(d_i-1\) 次,所以我们把这些数对应到\(1\cdots n-2\)上,用全排列除去对应位置的全排列,即把那些数看成了相同的。

这题中间计算过程会超long long,所以要记录一下质因数什么的。还有 \(n=1\) 的情况特判。

代码

#include<bits/stdc++.h>
using namespace std;
inline int read() {
int x=0,f=1;
char c=getchar();
for (;!isdigit(c);c=getchar()) if (c=='-') f=-1;
for (;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
const int maxn=151;
int p[maxn],ps=0,from[maxn];
bool np[maxn];
int f[maxn][maxn],ans[maxn];
int n,d[maxn],sum=0;
int main() {
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif
for (int i=2;i<maxn;++i) {
if (!np[i]) p[++ps]=i,from[i]=1;
for (int j=1;j<=ps && i*p[j]<maxn;++j) {
np[i*p[j]]=true;
from[i*p[j]]=i;
if (i%p[j]==0) break;
}
}
for (int i=2;i<maxn;++i) for (int j=i;j>1;j=from[j]) ++f[i][j/from[j]];
n=read();
for (int i=1;i<=n;++i) sum+=(d[i]=read()-1);
if (n==1 && d[1]==-1) puts("1"),exit(0);
for (int i=1;i<=n;++i) if (d[i]<0) puts("0"),exit(0);
if (sum!=n-2) puts("0"),exit(0);
for (int i=2;i<maxn;++i) ans[i]+=f[n-2][i];
for (int i=1;i<=n;++i) for (int j=2;j<maxn;++j) ans[j]-=f[d[i]][j];
long long the=1;
for (int i=2;i<maxn;++i) for (int k=1;k<=ans[i];++k) the*=i;
printf("%lld\n",the);
return 0;
}

bzoj1211-树的计数的更多相关文章

  1. [HNOI2004][bzoj1211] 树的计数(prufer序列)

    1211: [HNOI2004]树的计数 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3432  Solved: 1295[Submit][Stat ...

  2. bzoj1211树的计数 x bzoj1005明明的烦恼 题解(Prufer序列)

    1211: [HNOI2004]树的计数 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3432  Solved: 1295[Submit][Stat ...

  3. BZOJ1211树的计数

    裸的prufer结论. 给个小链接prufer序列 ,里面有一个性质4就是本题答案,严谨证明可以上网找一找,如果从多组组合角度理解也可以. 剩下的就是特判,n==1时,du==0,1个,du!=0,废 ...

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

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

  5. P2290 [HNOI2004]树的计数(bzoj1211)

    洛谷P2290 [HNOI2004]树的计数 bzoj1211 [HNOI2004]树的计数 Description 一个有\(n\)个结点的树,设它的结点分别为\(v_1,v_2,\cdots, v ...

  6. BZOJ1211: [HNOI2004]树的计数

    1211: [HNOI2004]树的计数 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1245  Solved: 383[Submit][Statu ...

  7. prufer BZOJ1211: [HNOI2004]树的计数

    以前做过几题..好久过去全忘了. 看来是要记一下... [prufer] n个点的无根树(点都是标号的,distinct)对应一个 长度n-2的数列 所以 n个点的无根树有n^(n-2)种 树 转 p ...

  8. bzoj1211: [HNOI2004]树的计数(prufer序列+组合数学)

    1211: [HNOI2004]树的计数 题目:传送门 题解: 今天刚学prufer序列,先打几道简单题 首先我们知道prufer序列和一颗无根树是一一对应的,那么对于任意一个节点,假设这个节点的度数 ...

  9. [bzo1211][HNOI2004]树的计数_prufer序列

    树的计数 bzoj-1211 HNOI-2004 题目大意:题目链接. 注释:略. 想法: prufer序列有一个性质就是一个数在prufer序列中出现的次数等于这个prufer序列生成的树中它的度数 ...

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

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

随机推荐

  1. spring_cloud多个微服务访问时偶发forward_error问题

    1.问题: 最近在做SpringBoot项目的时候,有多个分开的微服务,偶发forward error 问题 2.猜想: 个人理解为服务跳转错误,可能本身没找到目标服务,或者目标服务损坏 3.解决: ...

  2. 简单的Slony-I设置实例 II

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL集群方案相关索引页     回到顶级页面:PostgreSQL索引页 接前面例子, 简单的Slony-I设置实例 这次我 ...

  3. Nginx入门篇(七)之Nginx+keepalived高可用集群

    一.keepalived介绍 keepalived软件最开始是转为负载均衡软件LVS而设计,用来管理和监控LVS集群系统中各个服务节点的状态,后来又加入了可实现高可用的VRRP功能.所以Keepali ...

  4. Yii2 Gridview 动态显示行或列和action列

    我们知道Yii中的GridView组件是非常好用的. 某些情况要动态显示某列,这时候就要用到visible属性 'propString' => ['attribute' => 'prope ...

  5. rpmforge

    Could not retrieve mirrorlist http://mirrorlist.repoforge.org/el6/mirrors-rpmforge error was : PYCUR ...

  6. JS基础,相亲,逻辑训练

    简单逻辑 <script> var a = prompt("有房么?"); // if(a == "有") { alert("结婚吧&qu ...

  7. Maven学习(一)-----Maven安装配置总结

    想要安装 Apache Maven 在Windows 系统上, 需要下载 Maven 的 zip 文件,并将其解压到你想安装的目录,并配置 Windows 环境变量. 所需工具 : JDK 1.8 M ...

  8. mnist手写数字识别(神经网络)

    import numpy as np from sklearn.neural_network import MLPClassifier path = 'mnist.npz' f = np.load(p ...

  9. JavaScript学习笔记(四)——DOM

    第五章 网页交互——文本对象模型[Document object model] 1 简单介绍DOM,dom是将html与javascript进行交互的工具. [使用innerHTML时注意:html中 ...

  10. 解决登录linux输入密码问题

    1.使用密钥 ssh-keyssh -i .ssh/*.key root@<ip_addr> 2.使用sshpass 安装 rpm 包:yum install sshpass 配置文件: ...