bzoj1211-树的计数
题意
给出 \(n\) 和长度为 \(n\) 的数列 \(d\) 表示每个点的度数,问有多少颗满足要求的树。
分析
这题是prufer编码的应用。
prufer编码是对一个带标号无根树的刻画,生成方式是:对于一棵树,每次找到度数为1的编号最小的节点,把与这个节点相邻的那个节点加在生成数列后面,删除这个节点;进行这个过程直到树只剩下两个点。这样我们就生成了这棵树的prufer数列,长度为 \(n-2\) 。
反过来,一个prufer编码唯一对应一棵树,因为我们可以用prufer编码唯一对应回一棵树,因此构成双射。解码方法如下:对于 \(i=n-2\cdots 1\) ,找出在prufer序列中后 \(i\) 个数中没有出现过的而且没有用过的最小数 \(x\),加边 \((x,a_i)\) ,把 \(x\) 标记为用过。最后剩下的一个数直接连在最后一位上即可。很明显每次我们都能唯一确定这个数,因此可以唯一地连边。
这题的答案是
\]
原因是每个点的度数为 \(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-树的计数的更多相关文章
- [HNOI2004][bzoj1211] 树的计数(prufer序列)
1211: [HNOI2004]树的计数 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3432 Solved: 1295[Submit][Stat ...
- bzoj1211树的计数 x bzoj1005明明的烦恼 题解(Prufer序列)
1211: [HNOI2004]树的计数 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3432 Solved: 1295[Submit][Stat ...
- BZOJ1211树的计数
裸的prufer结论. 给个小链接prufer序列 ,里面有一个性质4就是本题答案,严谨证明可以上网找一找,如果从多组组合角度理解也可以. 剩下的就是特判,n==1时,du==0,1个,du!=0,废 ...
- bzoj1211: [HNOI2004]树的计数 prufer编码
题目链接 bzoj1211: [HNOI2004]树的计数 题解 prufer序 可重排列计数 代码 #include<bits/stdc++.h> using namespace std ...
- P2290 [HNOI2004]树的计数(bzoj1211)
洛谷P2290 [HNOI2004]树的计数 bzoj1211 [HNOI2004]树的计数 Description 一个有\(n\)个结点的树,设它的结点分别为\(v_1,v_2,\cdots, v ...
- BZOJ1211: [HNOI2004]树的计数
1211: [HNOI2004]树的计数 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1245 Solved: 383[Submit][Statu ...
- prufer BZOJ1211: [HNOI2004]树的计数
以前做过几题..好久过去全忘了. 看来是要记一下... [prufer] n个点的无根树(点都是标号的,distinct)对应一个 长度n-2的数列 所以 n个点的无根树有n^(n-2)种 树 转 p ...
- bzoj1211: [HNOI2004]树的计数(prufer序列+组合数学)
1211: [HNOI2004]树的计数 题目:传送门 题解: 今天刚学prufer序列,先打几道简单题 首先我们知道prufer序列和一颗无根树是一一对应的,那么对于任意一个节点,假设这个节点的度数 ...
- [bzo1211][HNOI2004]树的计数_prufer序列
树的计数 bzoj-1211 HNOI-2004 题目大意:题目链接. 注释:略. 想法: prufer序列有一个性质就是一个数在prufer序列中出现的次数等于这个prufer序列生成的树中它的度数 ...
- 树的计数 + prufer序列与Cayley公式 学习笔记
首先是 Martrix67 的博文:http://www.matrix67.com/blog/archives/682 然后是morejarphone同学的博文:http://blog.csdn.ne ...
随机推荐
- 关于Linux_shell中的管道命令pipe “|”的简单学习和使用
什么是 "|"? |其实是linux shell 中的一个命令:管道命令(pipe) 管道命令操作符是:"|",它仅能处理经由前面一个指令传出的正确输出信息,也 ...
- # 20155337 《Android程序设计》实验四实验报告
20155337 <Android程序设计>实验四实验报告 实验一 实验内容 Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPU ...
- 成都Uber优步司机奖励政策(4月16日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 使用三层交换机实现不同vlan的互通
如下拓扑图所示,要实现vlan10(192.168.10.0/24)与vlan 20(192.168.20.0/24)的网络互通. 三层交换机配置: 创建vlan:Switch#configure t ...
- L018-crond的生产场景经验小节
L018-crond的生产场景经验小节 怎么说呢,其实L018这节课还是巩固crond的知识,前半堂课主要是解决上堂课老师留的作业(在L017已经更新,拉到最后),然后剩下的半堂客主要是讲解了一些生产 ...
- Entity Framework中的几种加载方式
在Entity Framework中有三种加载的方式,分别是延迟加载,自动加载和显示加载.下面用一个例子来说明:现在有两个表,一个是资料表(Reference),另外一个表是资料分类表 ...
- 在CentOS 7下编译安装Nginx+PHP+MySQL环境
本文转载自:http://www.softeng.cn/?p=156,本文已获得作者授权,未经作者同意,不可转载. 1.前言 本文适合于已经对Linux操作系统具有基本操作经验,并且能够在Linux或 ...
- Redis主从复制(Master/Slave) 与哨兵模式
Redis主从复制是什么? 行话:也就是我们所说的主从复制,主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主 Redis主从复制 ...
- 前端之JavaScript(二)
一.概述 本篇主要介绍JavaScript的BOM和DOM操作,在前端之JavaScript(一)中介绍了JavaScript基础知识 1.1.BOM和DOM BOM(Browser Object M ...
- 使用Idea工具创建Maven WebApp项目
(1)New Project,选择模板,配置SDK (2)配置项目名及项目组名 GroupID是项目组织唯一的标识符, 比如我的项目叫test001 那么GroupID应该是 com.lixiaomi ...