【BZOJ 1005】 1005: [HNOI2008]明明的烦恼 (prufer数列+高精度)
1005: [HNOI2008]明明的烦恼
Time Limit: 1 Sec Memory Limit: 162 MB
Submit: 4981 Solved: 1941Description
自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在
任意两点间连线,可产生多少棵度数满足要求的树?Input
第一行为N(0 < N < = 1000),
接下来N行,第i+1行给出第i个节点的度数Di,如果对度数不要求,则输入-1Output
一个整数,表示不同的满足要求的树的个数,无解输出0
Sample Input
3
1
-1
-1Sample Output
2HINT
两棵树分别为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数列+高精度)的更多相关文章
- BZOJ 1005 [HNOI2008]明明的烦恼 ★(Prufer数列)
题意 N个点,有些点有度数限制,问这些点可以构成几棵不同的树. 思路 [Prufer数列] Prufer数列是无根树的一种数列.在组合数学中,Prufer数列是由一个对于顶点标过号的树转化来的数列,点 ...
- 【bzoj1005】[HNOI2008]明明的烦恼 Prufer序列+高精度
题目描述 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? 输入 第一行为N(0 < N < = 1000),接下来N行,第i+1行给出第i ...
- [bzoj1005][HNOI2008]明明的烦恼-Prufer编码+高精度
Brief Description 给出标号为1到N的点,以及某些点最终的度数,允许在 任意两点间连线,可产生多少棵度数满足要求的树? Algorithm Design 结论题. 首先可以参考这篇文章 ...
- bzoj 1005: [HNOI2008]明明的烦恼 prufer编号&&生成树计数
1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2248 Solved: 898[Submit][Statu ...
- BZOJ 1005 [HNOI2008]明明的烦恼 (Prufer编码 + 组合数学 + 高精度)
1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5786 Solved: 2263[Submit][Stat ...
- bzoj 1005 [HNOI2008] 明明的烦恼 (prufer编码)
[HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5907 Solved: 2305[Submit][Status][Di ...
- 【BZOJ 1005】[HNOI2008]明明的烦恼(暴力化简法)
[题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1005 [题意] 中文题 [题解] 一棵节点上标有序号的树会和一个prufer数列唯一对 ...
- BZOJ.1005.[HNOI2008]明明的烦恼(Prufer 高精 排列组合)
题目链接 若点数确定那么ans = (n-2)!/[(d1-1)!(d2-1)!...(dn-1)!] 现在把那些不确定的点一起考虑(假设有m个),它们在Prufer序列中总出现数就是left=n-2 ...
- 【BZOJ 1005】[HNOI2008]明明的烦恼(化简的另一种方法)
[题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1005 [题意] [题解] 题目和题解在上一篇; 这里 对 [(m^(n-2-tot)) ...
- 【BZOJ 1005】[HNOI2008]明明的烦恼
Description 自从明明学了树的结构,就对奇怪的树产生了兴趣...... 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为 ...
随机推荐
- ElasticStack系列之十七 & 大文本搜索性能提升方案
1. 什么是大文本?具体是什么? 首先需要理解,ElasticSearch 建立索引完成全文检索的前提是将待检索的信息导入到 ElasticSearch 中.而有的信息对应的正文内容会非常的打,可能达 ...
- 鸟哥的Linux私房菜——第十六章:学习Shell Scripts
视频链接:http://www.bilibili.com/video/av10565321/ 1. 什么是 Shell Script (shell写的脚本)1.1 干嘛学习 shell s ...
- crontab定时任务2_net
2017年2月25日, 星期六 crontab定时任务2_net 1.先来一个小小的例子 查看当前路径: [root@root test]# pwd /home/admin/test [root@ro ...
- 分享一个C#创建Barcode的DLL
用于工作需要产生Barcode,随手从网上找了一个DLL(原文地址忘了) http://files.cnblogs.com/panchunting/barcode_bin.zip 使用非常简单,只需添 ...
- C++单链表反转
单链表反转笔记: #include<iostream> #include<string.h> using namespace std; struct ListNode { in ...
- TensorBoard 简介及使用流程【转】
转自:https://blog.csdn.net/gsww404/article/details/78605784 仅供学习参考,转载地址:http://blog.csdn.net/mzpmzk/ar ...
- 关于Mysql5.6半同步主从复制的开启方法【转】
介绍 先了解一下mysql的主从复制是什么回事,我们都知道,mysql主从复制是基于binlog的复制方式,而mysql默认的主从复制方式,其实是异步复制. 主库实际上并不关心从库是否把数据拉完没有, ...
- python进阶之魔法函数
__repr__ Python中这个__repr__函数,对应repr(object)这个函数,返回一个可以用来表示对象的可打印字符串.如果我们直接打印一个类,向下面这样 class A(): ...
- click模块使用
# coding:utf8 import time import click @click.command() @click.option('--id', default='123', help='a ...
- oracle数据库如何创建用户和角色,并给其赋权?
一.创建用户并赋予权限 1.创建用户 create user wangxiangyu identified by wangxiangyu; 2.赋权 grant dba to wangxiangyu; ...