BZOJ1211: [HNOI2004]树的计数(prufer序列)
2024-09-07 14:33:07
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 2987 Solved: 1111
[Submit][Status][Discuss]
Description
一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵。给定n,d1, d2, …, dn,编程需要输出满足d(vi)=di的树的个数。
Input
第一行是一个正整数n,表示树有n个结点。第二行有n个数,第i个数表示di,即树的第i个结点的度数。其中1<=n<=150,输入数据保证满足条件的树不超过10^17个。
Output
输出满足条件的树有多少棵。
Sample Input
4
2 1 2 1
2 1 2 1
Sample Output
2
HINT
Source
答案为
上面是整棵树的排列方案
下面是每个点重复的方案
一边除乘一边除
// luogu-judger-enable-o2
#include<cstdio>
#define int long long
using namespace std;
const int MAXN = ;
inline int read() {
char c = getchar(); int x = , f = ;
while(c < '' || c > '') { if(c == '-')f = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * f;
}
int inder[MAXN], N, sum = ;
int js[MAXN];
main() {
#ifdef WIN32
freopen("a.in", "r", stdin);
#endif
N = read();
js[] = js[] = ;
for(int i = ; i <= ; i++) js[i] = js[i-] * i;
for(int i = ; i <= N; i++) {
inder[i] = read(); sum += inder[i] - ;
if(inder[i] == && N != ) {printf("");return ;}
}
if(sum != N - ) {printf("");return ;}
int Now = , times = ;
for(int i = ; i <= N - ; i++) {
Now *= i;
if(times > N) break;
if(Now % js[ inder[times] - ] == ) Now /= js[ inder[times] - ], times++;
}
printf("%lld",Now);
return ;
}
最新文章
- VirtualBox Ubuntu Server 16.04 手动设置 网络(IP, DNS, 路由)
- 【URAL 1018】Binary Apple Tree
- div自定义的滚动条 (竖直导航条)
- SqlSever基础 except 差集 前一个结果中不含有后一个结果的元素
- 代码SketchPaintCode绘制
- 【django】request
- Jquery库及其他库之间的$命名冲突解决办法
- Linux进程通信——管道
- void 0 === undefined
- SpringMVC(七):@RequestMapping下使用POJO对象绑定请求参数值
- 咸鱼入门到放弃4——Http协议
- TCP/IP 通信
- MapReduce核心 - - - Shuffle
- js中,for循环里面放ajax,ajax访问不到变量以及每次循环获取不到数据问题总结
- ajax模拟获取json
- tomcat远程部署war包,显示连接被重置
- Codeforces Round #367 (Div. 2) D. Vasiliy&#39;s Multiset(01字典树求最大异或值)
- hdu2588-GCD-(欧拉函数+分解因子)
- Hadoop的本地库(Native Libraries)介绍
- 027 Spark的优化总结