以前做过几题。。好久过去全忘了。

看来是要记一下。。。

【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]树的计数的更多相关文章

  1. bzoj1211: [HNOI2004]树的计数 prufer编码

    题目链接 bzoj1211: [HNOI2004]树的计数 题解 prufer序 可重排列计数 代码 #include<bits/stdc++.h> using namespace std ...

  2. bzoj1211: [HNOI2004]树的计数(prufer序列+组合数学)

    1211: [HNOI2004]树的计数 题目:传送门 题解: 今天刚学prufer序列,先打几道简单题 首先我们知道prufer序列和一颗无根树是一一对应的,那么对于任意一个节点,假设这个节点的度数 ...

  3. BZOJ1211: [HNOI2004]树的计数

    1211: [HNOI2004]树的计数 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1245  Solved: 383[Submit][Statu ...

  4. bzoj1211: prufer序列 | [HNOI2004]树的计数

    题目大意: 告诉你树上每个节点的度数,让你构建出这样一棵树,问能够构建出树的种树 这里注意数量为0的情况,就是 当 n=1时,节点度数>0 n>1时,所有节点度数相加-n!=n-2 可以通 ...

  5. 【prufer编码】BZOJ1211 [HNOI2004]树的计数

    Description 给定一棵树每个节点度的限制为di,求有多少符合限制不同的树. Solution 发现prufer码和度数必然的联系 prufer码一个点出现次数为它的度数-1 我们依然可以把树 ...

  6. [BZOJ1211][HNOI2004]树的计数(Prufer序列)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1211 分析: 关于无根树的组合数学问题肯定想到Prufer序列,类似bzoj1005那 ...

  7. BZOJ1211:[HNOI2004]树的计数(组合数学,Prufer)

    Description 一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, d2, …, dn,编程需要 ...

  8. bzoj1211: [HNOI2004]树的计数 prufer序列裸题

    一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, d2, …, dn,编程需要输出满足d(vi)=di ...

  9. BZOJ1211: [HNOI2004]树的计数(prufer序列)

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2987  Solved: 1111[Submit][Status][Discuss] Descript ...

随机推荐

  1. C#通过代码彻底结束桌面进程explorer,解决自动重启问题

    C# 通过代码 Process.Kill 方法杀死桌面进程后,会自动重启 其实可以通过 Taskkill 指令结束桌面进程, 在命令行查看 taskkill 帮助, TASKKILL [/S syst ...

  2. Ax=λx=λIx

  3. (转)如何使VMware ip与本机ip处于同一网段

    如何使VMware ip与本机ip处于同一网段 原创 2017年05月08日 17:28:56 1287 首先确认本机ip  可以看出一下信息: 本机ip: 192.168.1.162 网关:192. ...

  4. 我的Android进阶之旅------>如何获取Android控件的宽和高

    本文转载于:http://blog.csdn.net/johnny901114/article/details/7839512 我们都知道在onCreate()里面获取控件的高度是0,这是为什么呢?我 ...

  5. MyBatis -- 一步步教你使用MyBatis

    1.建立开发环境 1.1  创建项目,java项目或者javaweb项目均可,如图: 1.2  加入所须要的jar包到项目lib文件夹下 一个MyBatis-3.2.4.jar包 一个驱动包mysql ...

  6. python+NLTK 自然语言学习处理四:获取文本语料和词汇资源

    在前面我们通过from nltk.book import *的方式获取了一些预定义的文本.本章将讨论各种文本语料库 1 古腾堡语料库 古腾堡是一个大型的电子图书在线网站,网址是http://www.g ...

  7. R语言编写乘法表

    for(i in 1:9){ for(j in 1:i){ m = j*i cat(i,'*',j,'=',m,' ') } cat('\n') } 1 * 1 = 1 2 * 1 = 2 2 * 2 ...

  8. R语言set.seed()函数介绍

    set.seed(),该命令的作用是设定生成随机数的种子,种子是为了让结果具有重复性.如果不设定种子,生成的随机数无法重现.这个函数的主要目的,是让你的模拟能够可重复出现,因为很多时候我们需要取随机数 ...

  9. QT修改应用程序图标

    要准备一个ico的图标,必须是ico格式,切记!! 可以用png或者其他的在线转换:http://www.easyicon.net/covert/ 用记事本 新建文件icon.rc,内容为: IDI_ ...

  10. eclipse的问题:如何在debug模式下,能始终看到某变量的值

    Window—>Show View—>other—>Debug—>Expressions中左边是变量名,右边显示变量value.