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编码的性质:
  (1)树的prufer编码的实现
        不断 删除树中度数为1的最小序号的点,并输出与其相连的节点的序号  直至树中只有两个节点
  (2)通过观察我们可以发现
        任意一棵n节点的树都可唯一的用长度为n-2的prufer编码表示
        度数为m的节点的序号在prufer编码中出现的次数为m-1
  (3)怎样将prufer编码还原为一棵树??
        从prufer编码的最前端开始扫描节点,设该节点序号为 u ,寻找不在prufer编码的最小序号且没有被标记的节点 v ,连接   u,v,并标记v,将u从prufer编码中删除。扫描下一节点。
该题需要将树转化为prufer编码
因为一个点度为di,那么在prufer序列中出现di-1次
所以对于已知的度,sum=∑di-1(已知),cnt为有多少已知点
那么从序列中选出sum为方案C(sum,n-2)
对于已知di,产生的方案数为${{(n-2)!} \over {\prod (d_i - 1)}!}$
对于无限制的点,可以这样考虑,剩下的n-2-sum为每一位选择都有n-cnt种
所以方案为(n-cnt)n-2-sum
把三者乘起来
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
struct Big_Num
{
int a[],len;
Big_Num()
{}
Big_Num &operator *=(const int &b)
{int i;
for (i=;i<=len;i++)
a[i]*=b;
for (i=;i<=len;i++)
a[i+]+=a[i]/,a[i]%=;
int loc=len+;
while (a[loc])
{
a[loc+]+=a[loc]/;
a[loc]%=;
loc++;
}
len=loc-;
}
void print()
{int i;
for (i=len;i>=;i--) printf("%d",a[i]);
cout<<endl;
}
}ans;
int d[],du[],pri[],pre[],tot,n,cnt,sum,flag;
bool vis[];
int main()
{int i,j;
freopen("tree1.in","r",stdin);
freopen("1005.out","w",stdout);
cin>>n;
flag=;
for (i=;i<=n;i++)
{
scanf("%d",&d[i]);
if (d[i]!=-) cnt++,sum+=d[i]-;
if (d[i]==||d[i]==n) flag=;
}
if (n==)
{
cout<<;
return ;
}
if (n==)
{
if ((d[]==||d[]>)||(d[]==||d[]>))
cout<<;
else cout<<;
return ;
}
if (sum>n-)
{
cout<<;
return ;
}
if (flag)
{
cout<<;
return ;
}
for (i=;i<=n-;i++)
du[i]++;
for (i=;i<=n--sum;i++)
du[i]--;
for (i=;i<=n;i++)
if (d[i]!=-)
{
for (j=;j<=d[i]-;j++)
du[j]--;
}
for (i=;i<=n--sum;i++)
du[n-cnt]++; for (i=;i<=;i++)
{
if (vis[i]==)
{
pri[++tot]=i;
pre[i]=i;
}
for (j=;j<=tot;j++)
{
if (pri[j]*i>) break;
vis[i*pri[j]]=;
pre[i*pri[j]]=pri[j];
if (i%pri[j]==) break;
}
}
for (i=;i>=;i--)
if (pre[i]!=i)
{
du[pre[i]]+=du[i];
du[i/pre[i]]+=du[i];
du[i]=;
}
ans.a[]=;ans.len=;
for (i=;i<=;i++)
if (du[i]>)
{
for (j=;j<=du[i];j++)
ans*=i;
}
ans.print();
}

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

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

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

  2. bzoj1005 [HNOI2008]明明的烦恼

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

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

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

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

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

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

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

  6. BZOJ 1005: [HNOI2008]明明的烦恼( 组合数学 + 高精度 )

    首先要知道一种prufer数列的东西...一个prufer数列和一颗树对应..然后树上一个点的度数-1是这个点在prufer数列中出现次数..这样就转成一个排列组合的问题了.算个可重集的排列数和组合数 ...

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

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

  8. 【BZOJ 1005】 1005: [HNOI2008]明明的烦恼 (prufer数列+高精度)

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

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

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

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

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

随机推荐

  1. 解决办法:由于oracle版本不同导致导入数据时失败

    在向一个数据库导入dmp文件时,出现了如下错误 经查询,是由于"导出的dmp文件与导入的数据库的版本不同造成的" 用notepad查看dmp文件的版本,看看是否和数据库版本一致 解 ...

  2. Beta第四天

    听说

  3. 实现mypwd

    1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 实现mypwd 4 测试mypwd 提交过程博客的链接 代码如图

  4. python的Virtualenv

    Virtualenv 虚拟的 Python 环境(简称 venv) 是一个能帮助你在本地目录安装不同版本的 Python 模块的 Python 环境,你可以不再需要在你系统中安装所有东西就能开发并测试 ...

  5. Scrum 冲刺 第二日

    Scrum 冲刺 第二日 目录 要求 项目链接 燃尽图 问题 今日任务 明日计划 成员贡献量 要求 各个成员今日完成的任务(如果完成的任务为开发或测试任务,需给出对应的Github代码签入记录截图:如 ...

  6. 解决vue2.0路由 TypeError: Cannot read property 'matched' of undefined 的错误问题

    刚开始使用vue-router2.0,虽然也用了vux,用起来却发现一个问题--具体如下: 正常情况下使用脚手架跑完之后,然后修改源项目,首先在main.js入口里把该import进去的vuex,vu ...

  7. Spring邮件发送1

    注意:邮件发送code中,邮件服务器的申请和配置是比较主要的一个环节,博主这里用的是QQ的邮件服务器.有需要的可以谷歌.百度查下如何开通. 今天看了下Spring的官方文档的邮件发送这一章节.在这里记 ...

  8. OpenShift实战(二):OpenShift节点扩容

    1.新增节点信息 增加节点如下,请将xxx改为自己的域名 node6.xxx.net Node 192.168.8.90 8G 20G/60G 4C node7.xxx.net Node 192.16 ...

  9. Web Api HttpWebRequest 请求 Api 及 异常处理

    HttpWebRequest request = WebRequest.CreateHttp(url); request.Method = "post"; request.Head ...

  10. MySQL Group Relication 部署环境入门篇

      一:环境介绍   cenos 6.7 版本 数据库的版本5.7.19 二:部署规划单机多实例的部署   端口号 数据目录  group_repplicatoon 通信接口   3307 /data ...