1005: [HNOI2008]明明的烦恼

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 4981  Solved: 1941

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

Source

【分析】

  先特判无解的情况。

  假设$sum=\sum(d[i]-1)|[d[i]!=-1]$

  $ss=\sum 1 [d[i]!=-1]$

  则$Ans=C_{n-2}^{sum}*\dfrac{sum!}{\Pi(d[i]-1)!}*(n-ss)^{n-2-sum}$

  即$Ans=\dfrac{(n-2)!}{(n-2-sum)!*\Pi(d[i]-1)!}*(n-ss)^{n-2-sum}$

  这些数值都不会超过n的,先手动消因子,然后Ans用高精度,就是高精乘单精。

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 1010
#define mod 10000 int cnt[Maxn],d[Maxn]; struct hugeint
{
int w[Maxn],l;
hugeint() {memset(w,,sizeof(w));l=;}
friend hugeint operator * (hugeint x,int y)
{
for(int i=;i<=x.l;i++) x.w[i]*=y;
for(int i=;i<=x.l;i++) x.w[i+]+=x.w[i]/mod,x.w[i]%=mod;
while(x.w[x.l+]!=) x.w[x.l+]+=x.w[x.l+]/mod,x.w[++x.l]%=mod;
while(x.w[x.l]==&&x.l>) x.l--;
return x;
}
}; void cal(int x,int y)
{
for(int i=;i<=x*x;i++) if(x%i==)
{
while(x%i==) cnt[i]+=y,x/=i;
}
if(x!=) cnt[x]+=y;
} int main()
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&d[i]);
if(n==&&d[]>) printf("0\n");
else
{
int sum=,ss=;
for(int i=;i<=n;i++) if(d[i]!=-) sum+=d[i]-,ss++;
else if(d[i]==||d[i]>=n) {printf("0\n");return ;}
if(sum>n-) printf("0\n");
else
{
// for(int i=1;i<=n;i++) if(d[i]!=-1) d[i]--;
for(int i=;i<=n;i++) cnt[i]=;
for(int i=;i<=n-;i++) cal(i,);
for(int i=;i<=n--sum;i++) cal(i,-);
for(int i=;i<=n;i++) if(d[i]!=-)
{
for(int j=;j<=d[i]-;j++) cal(j,-);
}
cal(n-ss,n--sum);
hugeint ans;ans.w[]=;
for(int i=;i<=n;i++) while(cnt[i]--) ans=ans*i;
printf("%d",ans.w[ans.l]);
for(int i=ans.l-;i>=;i--) printf("%04d",ans.w[i]);printf("\n");
}
}
return ;
}

2017-04-25 15:36:48

【BZOJ 1005】 1005: [HNOI2008]明明的烦恼 (prufer数列+高精度)的更多相关文章

  1. BZOJ 1005 [HNOI2008]明明的烦恼 ★(Prufer数列)

    题意 N个点,有些点有度数限制,问这些点可以构成几棵不同的树. 思路 [Prufer数列] Prufer数列是无根树的一种数列.在组合数学中,Prufer数列是由一个对于顶点标过号的树转化来的数列,点 ...

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

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

  3. [bzoj1005][HNOI2008]明明的烦恼-Prufer编码+高精度

    Brief Description 给出标号为1到N的点,以及某些点最终的度数,允许在 任意两点间连线,可产生多少棵度数满足要求的树? Algorithm Design 结论题. 首先可以参考这篇文章 ...

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

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

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

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

  6. bzoj 1005 [HNOI2008] 明明的烦恼 (prufer编码)

    [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5907  Solved: 2305[Submit][Status][Di ...

  7. 【BZOJ 1005】[HNOI2008]明明的烦恼(暴力化简法)

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1005 [题意] 中文题 [题解] 一棵节点上标有序号的树会和一个prufer数列唯一对 ...

  8. BZOJ.1005.[HNOI2008]明明的烦恼(Prufer 高精 排列组合)

    题目链接 若点数确定那么ans = (n-2)!/[(d1-1)!(d2-1)!...(dn-1)!] 现在把那些不确定的点一起考虑(假设有m个),它们在Prufer序列中总出现数就是left=n-2 ...

  9. 【BZOJ 1005】[HNOI2008]明明的烦恼(化简的另一种方法)

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1005 [题意] [题解] 题目和题解在上一篇; 这里 对 [(m^(n-2-tot)) ...

  10. 【BZOJ 1005】[HNOI2008]明明的烦恼

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

随机推荐

  1. Ubantu里面的Sublime Text3不支持中文的解决办法

    参考的大佬链接:https://github.com/lyfeyaj/sublime-text-imfix 更新然后将系统升级到最新版本,在linux终端输入 sudo apt-get update ...

  2. 微信公众号用户OpenID同步导出系统

    一.简介 同步公众账号用户信息,包括OpenID.昵称.头像.地区等. 二.主要功能 同步公众账号用户 OpenID,以及昵称.头像.性别.地区.关注时间等,支持认证订阅号.认证服务号. 支持超过1万 ...

  3. 华中邀请赛现场赛F题 Seats

    题目链接:http://acm.whu.edu.cn/land/problem/detail?problem_id=1552 解题报告:题目意思应该很清楚,就是有n个人,分别属于7个班级,然后他们坐成 ...

  4. Nessus扫描策略

    本篇将简单介绍下Nessus的扫描策略设置.选用plugins及如何使用定制的策略来进行扫描任务. Step 1: 启动Nessus服务 root@kali:~# /etc/init.d/nessus ...

  5. object-c 数学计算公式

    1. 三角函数  double sin (double);正弦  double cos (double);余弦  double tan (double);正切  2 .反三角函数  double as ...

  6. python3迭代器和生成器

    1.手动访问迭代器中的元素 #要手动访问迭代器中的元素,可以使用next()函数 In [3]: with open('/etc/passwd') as f: ...: try: ...: while ...

  7. 自定义Web组件

    一.Session 1.面向对象基础 面向对象中通过索引的方式访问对象,需要内部实现 __getitem__ .__delitem__.__setitem__方法 +? 1 2 3 4 5 6 7 8 ...

  8. 移动端调试工具---vConsole

    vConsole:https://github.com/Tencent/vConsole/blob/dev/README_CN.md 使用方法: 使用npm进行安装: npm install --sa ...

  9. 字符串格式化格式 -- Numeric Format Strings

  10. SURF 特征匹配

    参考:http://www.cnblogs.com/ronny/p/4045979.html,博主对源码进行了分析,不过很多没看明白. 分为几个部分.积分图:借助积分图像,图像与高斯二阶微分模板的滤波 ...