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

---------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
 
using namespace std;
 
const int maxn = 1009;
 
int deg[maxn], N, m, c;
int p[maxn], pn;
int cnt[maxn];
bool F[maxn];
 
void Init() {
m = 0;
scanf("%d", &N);
for(int i = 0; i < N; i++) {
scanf("%d", deg + i);
if(~deg[i])
m++, c += deg[i] - 1;
}
pn = 0;
memset(F, 0, sizeof F);
for(int i = 2; i <= N; i++) {
if(!F[i])
p[pn++] = i;
for(int j = 0; j < pn && i * p[j] <= N; j++) {
F[i * p[j]] = true;
if(i % p[j] == 0) break;
}
}
}
 
void Work(int V, bool t) {
for(int x = 2; x <= V; x++ )
for(int i = 0, v = x; i < pn && v != 1; i++)
for(; v % p[i] == 0; v /= p[i], t ? cnt[i]++ : cnt[i]--);
}
 
struct BigInt {
static const int MAXN = 10000;
static const int BASE = 10000;
static const int WID = 4;
int s[MAXN], n;
BigInt(int _n = 0) : n(_n) {
memset(s, 0, sizeof s);
}
BigInt operator = (int num) {
for(; num; s[n++] = num % BASE, num /= BASE);
return *this;
}
BigInt operator *= (const int &x) {
for(int i = 0; i < n; i++) s[i] *= x;
for(int i = 0; i < n; i++) if(s[i] >= BASE) {
s[i + 1] += s[i] / BASE;
s[i] %= BASE;
}
if(s[n]) n++;
return *this;
}
void WRITE() {
int buf[8], t;
for(int i = n; i--; ) {
t = 0;
for(int v = s[i]; v; buf[t++] = v % 10, v /= 10);
if(i + 1 != n) {
for(int j = WID - t; j; j--)
putchar('0');
}
while(t--)
putchar(buf[t] + '0');
}
}
};
 
int main() {
Init();
if(c > N - 2) {
puts("0"); return 0;
}
memset(cnt, 0, sizeof cnt);
for(int i = 0, v = N - m; i < pn && v != 1; i++)
for(; v % p[i] == 0; v /= p[i], cnt[i]++);
for(int i = 0, t = N - 2 - c; i < pn; i++) 
if(cnt[i] > 0) cnt[i] *= t;
Work(N - 2, 1);
Work(N - c - 2, 0);
for(int i = 0; i < N; i++)
if(~deg[i]) Work(deg[i] - 1, 0);
BigInt ans; ans = 1;
for(int i = 0; i < pn; i++)
for(; cnt[i]--; ans *= p[i]);
ans.WRITE();
return 0;
}

---------------------------------------------------------------------

1005: [HNOI2008]明明的烦恼

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 3412  Solved: 1358
[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

Source

BZOJ 1005: [HNOI2008]明明的烦恼( 组合数学 + 高精度 )的更多相关文章

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

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

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

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

  3. BZOJ 1005 [HNOI2008]明明的烦恼 purfer序列,排列组合

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

  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编码)

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

  7. BZOJ 1005: [HNOI2008]明明的烦恼(高精度+prufer序)

    传送门 解题思路 看到度数和生成树个树,可以想到\(prufer\)序,而一张规定度数的图的生成树个数为\(\frac{(n-2)!}{\prod\limits_{i=1}^n(d(i)-1)!}\) ...

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

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

  9. BZOJ 1005: [HNOI2008]明明的烦恼(prufer数列)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1005 题意: Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标 ...

随机推荐

  1. Spring构造器注入、set注入和注解注入

    记得刚开始学spring的时候,老师就反复的提到依赖注入和切面,平常的java开发中,在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种方法耦合度太高并且不容易测试,sp ...

  2. PostMessage和SendMessage的区别

    1, PostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行,这是个异步消息投放函数.而SendMessage必须等待其他程序处理消息完了之后才返回,继续执行,这是个同步消息 ...

  3. AngularJs(一) MVC 模式的应用

    Model的应用 MVC的模式大家都是十分熟悉了,那么Angular是怎么规划的呢.数据被放在json文件中,通过Ajax获取数据. [{ "action": "Buy ...

  4. HTML5阴影与渐变

    一.阴影 阴影的效果,阴影有四个状态值控制,分别是shadowBlur,shadowOffsetX,shadowOffsetY和shadowColor.shadowBlur为阴影的像素模糊值,shad ...

  5. MailBee的简单使用

    保存为Eml文件方法:MailMessage.SaveMessage() 读取文件方法(不知道是不是我用的问题,没找到直接读取Eml文件的方法): MsgConvert conv = new MsgC ...

  6. 现在网页中流行的css3样式

    1.鼠标放在圆形图片中,图片渐渐的变方形[17素材头像的特效,觉得不错就研究下来了 ———— 17sucai.com] img{border-radius:50%;transition: all .4 ...

  7. BZOJ 2434: [Noi2011]阿狸的打字机( AC自动机 + DFS序 + 树状数组 )

    一个串a在b中出现, 那么a是b的某些前缀的后缀, 所以搞出AC自动机, 按fail反向建树, 然后查询(x, y)就是y的子树中有多少是x的前缀. 离线, 对AC自动机DFS一遍, 用dfs序+树状 ...

  8. 3种方式实现可滑动的Tab

    1. 第一种,使用 TabHost + ViewPager 实现 该方法会有一个Bug,当设置tabHost.setCurrentTab()为0时,ViewPager不显示(准确的说是加载),只有点击 ...

  9. String的构造函数、析构函数和赋值函数

    编写类String的构造函数.析构函数和赋值函数 已知类String的原型为: class String { public: String(const char *str = NULL); // 普通 ...

  10. Cortex-M3动态加载三(模块调用系统函数)

    在我的arm动态加载实验中需要解决一个模块调用系统函数的问题,可以使用以下的一个方法.将系统函数固定在某一段地址空间,然后导出这一块的符号表到符号文件中,要记载的模块link的时候使用这个符号表文件, ...