prufer BZOJ1211: [HNOI2004]树的计数
以前做过几题。。好久过去全忘了。
看来是要记一下。。。
【prufer】
n个点的无根树(点都是标号的,distinct)对应一个 长度n-2的数列
所以 n个点的无根树有n^(n-2)种
树 转 prufer数列: 每次删除编号最小的叶子节点,将与其相连的那个点 加入 prufer数列 直到树中只剩两个点,就结束
prufer数列 转 树: 首先是有个1到n的集合G,每次将prufer数列当前的第一项 和 当前G中 不在当前prufer里有的 最小的 元素x 连边。 接着删除当前prufer中的第一项 ,并在G中删除x。。直到prufer只剩两项,两者连边 结束
对树中的i号节点 在对应的prufer数列中 出现di-1次 (di为i号节点的度)
对于i号点度数为d[i]的 无根树 树的种数有 (n - 2) ! / ( (d1 - 1)! (d2 - 1)! ……(dn - 1)! )
1211: [HNOI2004]树的计数
所以 这是道基础题 上代码吧
#include <bits/stdc++.h>
using namespace std;
int n,d[],a[],b[],c[],t,k; long long x;
void hh(int x){
for (int i=;i<=t;++i){
while (!(x%a[i])) x/=a[i],++b[i];
}
}
int main(){
scanf("%d",&n);
for (int i=;i<=n;++i) {
scanf("%d",&d[i]);
if ((d[i]<&&n!=)||d[i]>=n) {printf("0\n"); return ;}
x+=d[i];
}
if (x!=(n-)*) {printf("0\n"); return ;}
if (n<) {printf("1\n");return ;}
sort(d+,d++n);
for (int i=;i<=n;++i) --d[i];
for (int i=;i<=;++i){
k=;
for (int j=;j<=i-;++j)
if (!(i%j)){k=;break;}
if (k) a[++t]=i;
}
k=; while (!d[k]) ++k; while (d[k]==) ++k;
for (int i=;i<=n;++i){
hh(i);
while (d[k]==i){
for (int j=;j<=t;++j) c[j]-=b[j]; ++k;
}
if (n-==i) for (int j=;j<=t;++j) c[j]+=b[j];
}
x=;
for (int i=;i<=t;++i)
for (int j=;j<=c[i];++j) x*=(long long)a[i];
printf("%lld\n",x);
return ;
}
Lancer
prufer BZOJ1211: [HNOI2004]树的计数的更多相关文章
- bzoj1211: [HNOI2004]树的计数 prufer编码
题目链接 bzoj1211: [HNOI2004]树的计数 题解 prufer序 可重排列计数 代码 #include<bits/stdc++.h> using namespace std ...
- bzoj1211: [HNOI2004]树的计数(prufer序列+组合数学)
1211: [HNOI2004]树的计数 题目:传送门 题解: 今天刚学prufer序列,先打几道简单题 首先我们知道prufer序列和一颗无根树是一一对应的,那么对于任意一个节点,假设这个节点的度数 ...
- BZOJ1211: [HNOI2004]树的计数
1211: [HNOI2004]树的计数 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1245 Solved: 383[Submit][Statu ...
- bzoj1211: prufer序列 | [HNOI2004]树的计数
题目大意: 告诉你树上每个节点的度数,让你构建出这样一棵树,问能够构建出树的种树 这里注意数量为0的情况,就是 当 n=1时,节点度数>0 n>1时,所有节点度数相加-n!=n-2 可以通 ...
- 【prufer编码】BZOJ1211 [HNOI2004]树的计数
Description 给定一棵树每个节点度的限制为di,求有多少符合限制不同的树. Solution 发现prufer码和度数必然的联系 prufer码一个点出现次数为它的度数-1 我们依然可以把树 ...
- [BZOJ1211][HNOI2004]树的计数(Prufer序列)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1211 分析: 关于无根树的组合数学问题肯定想到Prufer序列,类似bzoj1005那 ...
- BZOJ1211:[HNOI2004]树的计数(组合数学,Prufer)
Description 一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, d2, …, dn,编程需要 ...
- bzoj1211: [HNOI2004]树的计数 prufer序列裸题
一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, d2, …, dn,编程需要输出满足d(vi)=di ...
- BZOJ1211: [HNOI2004]树的计数(prufer序列)
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2987 Solved: 1111[Submit][Status][Discuss] Descript ...
随机推荐
- Linux下文件的基本操作
文件的基本操作 新建和删除文件夹 命令#mkdir /file 在当前目录创建file文件夹 命令#rmdir /file 删除当前目录下file文件夹 复制和移动文件 命令#cp text/file ...
- 用象棋的思维趣说IT人的职业发展和钱途
最近我花了不少功夫在学习象棋,也学习了王天一等高手的棋路,感觉IT人的职业和下棋一样,往好了讲,争主动权争实惠只争朝夕,往坏了讲,一步走错得用多步来弥补,如果错误太大未必能弥补回来.在本文里,就用下棋 ...
- mybatis注解实现CURD
我们来看下面这段代码: /** * The user Mapper interface. * * @author Wangzun * * @version 1.0 * * */ @CacheNames ...
- Stacks of Flapjacks(栈)
Stacks of Flapjacks Background Stacks and Queues are often considered the bread and butter of data ...
- Android jni 编程(参数的传递,成员,方法的)相互访问
package com.test.androidjni; import android.app.Activity; import android.os.Bundle; import android.u ...
- Symfony 上传图片教程
介绍:我使用的Bundle:"vich/uploader-bundle": "^1.4"; "liip/imagine-bundle": & ...
- Django——auth用户认证
之前我们在进行用户校验的时候,总是从数据库中获取数据,然后再进行对比,就像如下这样: def login(request): if request.method == "POST" ...
- 基于Linux Shell的开机启动服务
CentOS重启后,很多服务需要手动启动,很是麻烦,今天把需要开机启动或关闭的服务整理了一下,放入Linux Shell中,再将该Shell加入/etc/rc.local中,即可实现存储的自动挂载.S ...
- HDU - 1033 Edge 【模拟】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1033 题意 给定一个起始点 300 420 走的第一步是 310 420 下面的每一步 都由 输入决定 ...
- Data Structure Trie: suffix problem
http://www.geeksforgeeks.org/suffix-array-set-1-introduction/ http://www.geeksforgeeks.org/pattern-s ...