「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] 明明的烦恼的更多相关文章
- 【BZOJ1005】[HNOI2008]明明的烦恼(prufer序列)
[BZOJ1005][HNOI2008]明明的烦恼(prufer序列) 题面 BZOJ 洛谷 题解 戳这里 #include<iostream> #include<cstdio> ...
- 【bzoj1005】[HNOI2008]明明的烦恼
1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4175 Solved: 1660[Submit][Stat ...
- 【bzoj1005】 HNOI2008—明明的烦恼
http://www.lydsy.com/JudgeOnline/problem.php?id=1005 (题目链接) 题意 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多 ...
- 【bzoj1005】[HNOI2008]明明的烦恼 Prufer序列+高精度
题目描述 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? 输入 第一行为N(0 < N < = 1000),接下来N行,第i+1行给出第i ...
- 【BZOJ1005/1211】[HNOI2008]明明的烦恼/[HNOI2004]树的计数 Prufer序列+高精度
[BZOJ1005][HNOI2008]明明的烦恼 Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可 ...
- bzoj1005 [HNOI2008]明明的烦恼
1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3032 Solved: 1209 Description ...
- bzoj1005: [HNOI2008]明明的烦恼(prufer+高精度)
1005: [HNOI2008]明明的烦恼 题目:传送门 题解: 毒瘤题啊天~ 其实思考的过程还是比较简单的... 首先当然还是要了解好prufer序列的基本性质啦 那么和1211大体一致,主要还是利 ...
- BZOJ 1005 [HNOI2008] 明明的烦恼(组合数学 Purfer Sequence)
题目大意 自从明明学了树的结构,就对奇怪的树产生了兴趣...... 给出标号为 1 到 N 的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为 N( ...
- BZOJ 1005: [HNOI2008]明明的烦恼 Purfer序列 大数
1005: [HNOI2008]明明的烦恼 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...
随机推荐
- WebGis二次开发包实例
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.aspx.cs& ...
- jnhs-java实体类的有参构造器 无参构造器Could not instantiate bean class 实体类No default constructor found
new一个对象的时候要用到构造函数, 例如Hello hello = new Hello();这时调用的是Hello的无参数构造方法; Hello hello = new Hello("hi ...
- HTTPS的实现
1.安装专门的mod_ssl模块 [root@contos7 ~]# yum install mod_ssl Loaded plugins: fastestmirror, langpacks Load ...
- select2 如何自定义提示信息-布布扣-bubuko.com
标签:color dom layui href 默认事件 替换 each ase options 最近项目中使用到了select2来美化和丰富下拉框的功能,这款插件功能 ...
- pip list报错:DEPRECATION: The default format will switch to columns in the future.
一.现象: pip list 显示出以下错误: DEPRECATION: The default format will switch to columns in the future. Yo ...
- wamp httpd-vhosts.conf
配置Apache的httpd.conf文件 Include conf/extra/httpd-vhosts.conf 修改apache的vhost文件 <VirtualHost *:> D ...
- PHPStrom直接在编辑器打开php文件
以下是自己配置PHP+Apache的开发环境,集成环境的话要换第二种方法(看个人配置):PHPStrom 如果希望直接在编辑器打开php文件,要做以下这几步配置. 第一种:非集成环境 1 2 3 第二 ...
- openssl生成SSL证书的流程 - moonhillcity的博客 - CSDN博客
1.安装openssl 之后在/usr/lib/ssl目录下(ubuntu系统,用whereis查下ssl目录即可)下找到openssl.cnf,拷贝到工作目录下. 2.工作目录下新建demoCA文件 ...
- KNN最近邻算法
算法概述 K最近邻(K-Nearest Neighbor,KNN)算法,是著名的模式识别统计学方法,在机器学习分类算法中占有相当大的地位.它是一个理论上比较成熟的方法.既是最简单的机器学习算法之一,也 ...
- JavaScript--函数中this的几种指向
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...