1005: [HNOI2008]明明的烦恼

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 7121  Solved: 2816
[Submit][Status][Discuss]

Description

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

Input

  第一行为N(0 < N < = 1000),
接下来N行,第i+1行给出第i个节点的度数Di,如果对度数不要求,则输入-1

Output

  一个整数,表示不同的满足要求的树的个数,无解输出0

Sample Input

3
1
-1
-1

Sample Output

2

HINT

  两棵树分别为1-2-3;1-3-2

题解:

树的计数题目,可以想到是用prufer序列来求解。

先来科普一下prufer的性质:

  1. 每个prufer序列都唯一对应着一棵树。
  2. prufer序列的长度等于它所对应的树的节点数-2。
  3. 每个数在prufer序列中出现的次数等于该节点在树中的度数-1。

其实有了这些性质我们就可以做题了(想要证明的自行度娘),现在我们在来观察一下这道题,如果他给出的是所有点的度数,那么这道题就是一个不全相异的全排列个数(戳这里),但是他给出的点的度数只是一部分的,那我们就可以先当别的点不存在,先把这一部分的方案数求出来,设$tot=\Sigma{d[i]-1}$,$tot$即为已经确定度数的点在prufer序列里所占的个数,这一部分方案数为$C_{n-2}^{tot}$,但是别忘了我们还要处理重复的部分,处理第一个数向$tot$个数中插的方案数为$C_{tot}^{d[1]-1}$,同理处理第二个数的方案数是$C_{tot-(d[1]-1)}^{d[2]-1}$,剩下的以此类推。

但是别忘了我们还有没确定度数的点,但是这很好处理,我们设未确定的点数为$cnt$,这就相当于在$n-2-tot$的空间中随便选$cnt$个,那么答案即为$cnt^{n-2-tot}$

然后我们根据乘法原理可以的出答案

$ans=C_{n-2}^{tot}*C_{tot}^{d[1]-1}*C_{tot-(d[1]-1)}^{d[2]-1}*\cdots*C_{d[i]-1}^{d[i]-1}*cnt^{n-2-tot}$

我们把组合数公式展开来一波化简就得到了结果(数学公式崩了,凑或者看吧qwq)

这样再用一个高精就阔以了。

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
#define int long long
const int N=;
int d[N];
struct BigInt{
int m[N];
friend void operator *= (BigInt &a,int b){
int x=;
for(int i=;i<=a.m[];i++){
int y=a.m[i]*b+x;
a.m[i]=y%;
x=y/;
}
while(x){
a.m[++a.m[]]=x%;
x/=;
}
}
friend void operator /= (BigInt &a,int b){
int x=;
for(int i=a.m[];i>=;i--){
x+=a.m[i];
a.m[i]=x/b;
x%=b;
x*=;
}
while(a.m[a.m[]]==&&a.m[]>) a.m[]--;
}
friend void print(BigInt a){
for(int i=a.m[];i>=;i--) printf("%lld",a.m[i]);
puts("");
}
}x;
signed main(){
int n;
scanf("%lld",&n);
x.m[]=x.m[]=;
int cnt=,num=;
if(n==){
int k;
scanf("%lld",&k);
if(!k){puts("");}
else puts("");
return ;
}
for(int i=;i<=n;i++){
int mm;
scanf("%lld",&mm);
if(!mm){puts("");return ;}
if(mm==-) cnt++;
else {d[i]=mm-;num+=d[i];}
}
for(int i=;i<=n-;i++) x*=i;
//for(int i=1;i<=num;i++) x*=i;
//for(int i=2;i<=/*n-cnt-2*/num;i++) x*=i;
for(int i=;i<=n--num;i++) x*=cnt,x/=i;
for(int i=;i<=n;i++){
if(d[i]>){
for(int j=;j<=d[i];j++) x/=j;
}
}
print(x);
}

[HNOI2008][bzoj 1005]明明的烦恼(prufer序列)的更多相关文章

  1. BZOJ 1005 明明的烦恼(prufer序列+高精度)

    有一种东西叫树的prufer序列,一个树的与一个prufer序列是一一对应的关系. 设有m个度数确定的点,这些点的度为dee[i],那么每个点在prufer序列中出现了dee[i]-1次. 由排列组合 ...

  2. BZOJ 1005 明明的烦恼 Prufer序列+组合数学+高精度

    题目大意:给定一棵n个节点的树的节点的度数.当中一些度数无限制,求能够生成多少种树 Prufer序列 把一棵树进行下面操作: 1.找到编号最小的叶节点.删除这个节点,然后与这个叶节点相连的点计入序列 ...

  3. bzoj1005: [HNOI2008]明明的烦恼 prufer序列

    https://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. [BZOJ]1005 明明的烦恼(HNOI2008)

    BZOJ的第一页果然还是很多裸题啊,小C陆续划水屯些板子. Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间 ...

  6. BZOJ 1005 明明的烦恼

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

  7. BZOJ 1005 明明的烦恼 (组合数学)

    题解:n为树的节点数,d[ ]为各节点的度数,m为无限制度数的节点数. 则               所以要求在n-2大小的数组中插入tot各序号,共有种插法: 在tot各序号排列中,插第一个节点的 ...

  8. bzoj 1005: [HNOI2008]明明的烦恼 prufer编号&&生成树计数

    1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2248  Solved: 898[Submit][Statu ...

  9. BZOJ 1005 [HNOI2008]明明的烦恼 (Prufer编码 + 组合数学 + 高精度)

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

随机推荐

  1. C# HttpWebRequest向远程地址Post文件

    HttpWebRequest向远程地址Post文件 /// <summary> /// 上传文件到远程服务器 /// </summary> /// <param name ...

  2. 怎样理解HTMLCollection接口

    和 NodeList 类似, HTMLCollection 也是一个 类数组对象, 和NodeList不同的是, 它是各种 元素节点 的集合, 且不具有 forEach() 方法, 因此如果不转为真正 ...

  3. 怎样修改输入框 placehoder 提示文本的颜色?

    1. 在这个问题上, 不同浏览器的设置方法有所差异, 可以写成下面这种形式. ::-webkit-input-placeholder { /* WebKit browsers */ color: #9 ...

  4. html homework27

    1. 使用框架完成如下功能 将框架先上下分割成两部分(上半部分的为TopFrame).再将下半部分垂直分割为两部分(左侧为BottomLeftFrame,右侧为BottomRightFrame),为T ...

  5. AutoCAD2013 以上利用AccoreConsole+ c# NetApi Windows Froms 封装

    1# 封装类 public static class CmdHelper { /// <summary> /// 调用AutoCAD 安装目录下的AccoreConsole.exe来实现批 ...

  6. 手把手教你搭建FastDFS集群(下)

    手把手教你搭建FastDFS集群(下) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/u0 ...

  7. 【原创】Linux基础之logrotate

    logrotate logrotate ‐ rotates, compresses, and mails system logs logrotate is designed to ease admin ...

  8. BZOJ5017题解SNOI2017炸弹--玄学递推

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=5017 分析 老师讲课谈到了这道题,课上想出了个连边建图然后乱搞的操作,被老师钦定的递推方 ...

  9. java实现spark常用算子之mapPartitionsWithIndex

    import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ...

  10. vim insert VISUAL模式无法右键复制问题(转)

    转自:https://blog.csdn.net/coder_oyang/article/details/89096219 vim中使用鼠标右键粘贴,失败.vim的模式: 网上解法: 1. 普通模式下 ...