「BZOJ1005」[HNOI2008] 明明的烦恼

先放几个prufer序列的结论:

Prufer序列是一种对有标号无根树的编码,长度为节点数-2。

具体存在无根树转化为prufer序列和prufer序列转化为无根树两种操作:

无根树转化为prufer序列 1、找到编号最小的度数为1的点 2、删除该节点并在序列中添加与该节点相连的节点的编号 3、重复1,2操作,直到整棵树只剩下两个节点

prufer序列转化为无根树 设prufer序列为M,另一个集合G={1,2…n} 每次提取M中最靠前的元素u与G中不存在与M且最靠前的元素v,将u与v连边,分别在两个集合中删除u、v。 最后G中剩下两个元素,将这两个点连边。

Prufer序列中某个编号出现的次数等于这个编号的节点在无根树中的度数-1 。  一棵n个节点的无根树唯一地对应了一个长度为n-2的数列,数列中的每个数都在1到n的范围内

有关性质的应用 n个点构成的无根树的个数: $n^(n-2)$ 确定n个点度数分别为d1,d2…时无根树个数: $(n-2)!/((d1-1)!*(d2-1)!*…)$ n个点的

有标号有根树的个数: $n*n^{n-2}=n^{n-1}$

然后看这个题:

有某些点知道度数,那么先把这些点放到prufer序列中,设num为度数大于0的点数,fnum为已知度数的点出现次数总和,

方案数C_{n-2}^{fnum}*(n-2)!/((d1-1)!*(d2-1)!*…),然后把剩下的序列填满,每个序列有n-num种情况,乘法计数原理成起来即${n-num}^{n-2-fnum}$,最后将两部分乘起来即可。(这个题也用到了高精……)

 #include<algorithm>
#include<cstring>
#include<iostream>
#include<cstdio>
using namespace std;
#define ma(x) memset(x,0,sizeof(x))
int n,d[],num,fnum;
struct sz
{
int a[];
}a;
sz mul(sz &a,int b)
{
sz c;ma(c.a);
c.a[]=a.a[];
for(int i=;i<=a.a[];i++)
c.a[i]=a.a[i]*b;
for(int i=;i<=c.a[];i++)
if(c.a[i]>=)
{
c.a[i+]+=c.a[i]/;
c.a[i]%=;
if(i==c.a[])c.a[]++;
}
return c;
}
sz div(sz &a,int b)
{
sz ans;ma(ans.a);
int yu=;
for(int i=;i<=a.a[];i++)
{
yu=yu*+a.a[i];
if(yu/b>)
{
ans.a[++ans.a[]]=yu/b;
yu%=b;
}
else if(ans.a[])ans.a[]++;
}
return ans;
}
void print(sz &a)
{
for(int i=;i<=a.a[];i++)cout<<a.a[i];
puts("");
}
bool cmp(int a,int b){return a>b;}
signed main()
{
cin>>n;
for(int i=;i<=n;i++)
{
cin>>d[i];
if(d[i]>-)num++;
if(d[i]>=)fnum+=d[i]-;
if((d[i]==&&n!=)||d[i]>=n||(d[i]!=&&n==)){puts("");return ;}
}
a.a[]=a.a[]=;
for(int i=;i<=n-;i++)a=mul(a,i);//(n-2)!
sort(d+,d+n+,cmp);
reverse(a.a+,a.a+a.a[]+);
for(int i=;i<=num;i++)//(d[i]-1)!
for(int j=;j<d[i];j++)
a=div(a,j);
for(int i=;i<=n--fnum;i++)a=div(a,i);//(n-2-fnum)!
reverse(a.a+,a.a+a.a[]+);
for(int i=;i<=n--fnum;i++)
a=mul(a,n-num);
reverse(a.a+,a.a+a.a[]+);
print(a);
}

「BZOJ1005」[HNOI2008] 明明的烦恼的更多相关文章

  1. 【BZOJ1005】[HNOI2008]明明的烦恼(prufer序列)

    [BZOJ1005][HNOI2008]明明的烦恼(prufer序列) 题面 BZOJ 洛谷 题解 戳这里 #include<iostream> #include<cstdio> ...

  2. 【bzoj1005】[HNOI2008]明明的烦恼

    1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4175  Solved: 1660[Submit][Stat ...

  3. 【bzoj1005】 HNOI2008—明明的烦恼

    http://www.lydsy.com/JudgeOnline/problem.php?id=1005 (题目链接) 题意 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多 ...

  4. 【bzoj1005】[HNOI2008]明明的烦恼 Prufer序列+高精度

    题目描述 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? 输入 第一行为N(0 < N < = 1000),接下来N行,第i+1行给出第i ...

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

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

  6. bzoj1005 [HNOI2008]明明的烦恼

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

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

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

  8. BZOJ 1005 [HNOI2008] 明明的烦恼(组合数学 Purfer Sequence)

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

  9. BZOJ 1005: [HNOI2008]明明的烦恼 Purfer序列 大数

    1005: [HNOI2008]明明的烦恼 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...

随机推荐

  1. url映射 ccf (Java正则表达式80分解法)

    问题描述 试题编号: 201803-3 试题名称: URL映射 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 URL 映射是诸如 Django.Ruby on Rails 等 ...

  2. oracle使用dblink跨库查询的例子

    本文介绍了oracle数据库使用dblink进行跨库查询的方法,oracle dblink跨库查询教程,需要的朋友参考下.   oracle dblink跨库查询 方法一:首先,创建数据库链接: 复制 ...

  3. Python科学计算生态圈--Pandas

  4. golang之select

    2.switch语句 (1) (2) 3.select语句 4.for语句 (1)常规式 (2)条件式 (3) (4) goto break continue fallthrought ------- ...

  5. Vue--公有组件以及组件的使用和特点

    组件的作用:为了能够让功能与功能之间互不影响,使代码更加清晰整洁 1 <!DOCTYPE html> <html lang="en"> <head&g ...

  6. SQL Server 存储过程详解

    转自:https://blog.csdn.net/younghaiqing/article/details/62884658 一. 什么是存储过程 系统存储过程是系统创建的存储过程,目的在于能够方便的 ...

  7. C++ std::vector指定位置插入

    使用vector,必须加上:#include <vector> 1.初始化vector,一般有这几种方式: std::vector<std::wstring> v1; //创建 ...

  8. JQuery-- 实例:小米左右切图,淡入淡出,自动,小圆点触发轮播图

    示意图: demo <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  9. 阿里OSS-OSSFS

    简介 OSSFS就以把OSS作为文件系统的一部分,能让你在linux系统中把OSS bucket挂载到本地文件系统中,实现数据的共享. 主要功能 ossfs 基于s3fs 构建,具有s3fs 的全部功 ...

  10. php Laravel Thrift使用TMultiplexedProcessor复用端口模式

    thrift的使用中一般是一个Server对应一个Processor和一个Transport,如果有多个服务的话,那必须要启动多个Server,占用多个端口,这种方式显然不是我们想要的,所以thrif ...