题意

给出 \(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. 20155331 《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    20155331 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验内容及步骤 使用JDK编译.运行简单的java程序 实验目的与要求: 使用JDK和IDE编译.运行简 ...

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

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

  3. KDTable如何添加合计行?

    /** * 功能:添加合计行 * * @param table * 指定的KDTable * @param fields * 需要合计的列 */ public static void apendFoo ...

  4. CF543E Listening to Music

    题面 空间只有$64\text{MB}$!!! 题解 (据说正解是毒瘤分块套分块) 按照权值从大到小排序,对所有能够覆盖到它的区间的左端点打个标记 按照值域建一棵主席树就可以了 区间查询最大值,用$m ...

  5. java模拟http请求

    java模拟http发送请求,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求, 方法一: package main.utils; impo ...

  6. javaweb(二十)——JavaBean总结

    一.什么是JavaBean JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须私有化. 私有化的属性必须通过public类型的方法 ...

  7. ffmpeg 压缩H265 Windows 硬件编码

    硬件NVIDIA:ffmpeg.exe -i input.avi -c:v hevc_nvenc -preset:v fast output.mp4 软件          :ffmpeg.exe - ...

  8. sublime3配置java开发环境

    链接:http://www.jianshu.com/p/48a524a4f63c 或者:http://www.jianshu.com/p/9d167c4c4feb 侵权删!

  9. hdu6447

    YJJ's Salesman Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  10. python正则表达式re之compile函数解析

    re正则表达式模块还包括一些有用的操作正则表达式的函数.下面主要介绍compile函数. 定义: compile(pattern[,flags] ) 根据包含正则表达式的字符串创建模式对象. 通过py ...