的确,如果不知道这个编码的话的确是一脸懵逼。在这里放一篇认为讲的很详细的 BLOG,有关于编码的方式 & 扩展在里面都有所提及。

  欢迎点此进入 --> 大佬的博客

  在这里主要想推导一下最后面的扩展公式是怎么来的。问题:给定一棵树 & 树上各个节点的度数,求有多少棵满足要求的生成树?

  在了解了Prüfer编码之后,我们已经知道编码与生成树是一一对应的关系了,且一个数在Prüfer编号上面出现的次数即为它的度数 - 1;问题转化成为:一个长度为 \(n - 2\) 的序列中均为范围在 \(1\) ~ \(n\)的数字,规定了每个数字出现的次数,问有多少个合法的序列?首先不考虑是否合法,规定排列当中的数字各不相同,这样的排列有 \(\left ( n - 2 \right )!\) 种。但这样明显统计多了,因为当有相同的数字出现时,交换它们之间的相对位置并不会改变排列的实质。于是我们要在此基础之上除以每一种相同数字的排列数 : \(\prod \left ( d[i] - 1 \right )!\)。

  所以最后的式子是: \(\frac{\left ( n - 2 \right )!}{\prod \left ( d[i] - 1  \right )! }\)

  HNOI2004树的计数就是一道和和上面这个问题一模一样的题,实际上HNOI2008明明的烦恼也是同一道题(实在是不忍吐槽)。不过后者要写高精,我懒……

#include <bits/stdc++.h>
using namespace std;
#define maxn 1000
#define int long long
int n, d[maxn], cal[maxn];
int sum, ans = , a[maxn]; int read()
{
int x = , k = ;
char c;
c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} signed main()
{
n = read(); cal[] = ;
for(int i = ; i <= n; i ++) cal[i] = cal[i - ] * i;
for(int i = ; i <= n; i ++)
{
d[i] = read(); if(d[i])
sum += d[i] - ;
if(d[i] == && n != ) { printf("0\n"); return ; }
a[i] = cal[d[i] - ];
}
if(sum != n - ) { printf("0\n"); return ; }
sort(a + , a + + n);
int j = ;
while(a[j] == && j < n) j ++;
for(int i = ; i <= n - ; i ++)
{
ans *= i;
while(j <= n && !(ans % a[j])) ans /= a[j], j ++;
}
printf("%lld\n", ans);
return ;
}

【算法】Prüfer编码 —— HNOI2004树的计数的更多相关文章

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

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

  2. P2290 [HNOI2004]树的计数(bzoj1211)

    洛谷P2290 [HNOI2004]树的计数 bzoj1211 [HNOI2004]树的计数 Description 一个有\(n\)个结点的树,设它的结点分别为\(v_1,v_2,\cdots, v ...

  3. BZOJ1211: [HNOI2004]树的计数

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

  4. BZOJ 1211: [HNOI2004]树的计数( 组合数学 )

    知道prufer序列就能写...就是求个可重集的排列...先判掉奇怪的情况, 然后答案是(N-2)!/π(d[i]-1)! -------------------------------------- ...

  5. 【BZOJ 1211】 1211: [HNOI2004]树的计数 (prufer序列、计数)

    1211: [HNOI2004]树的计数 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2468  Solved: 868 Description 一 ...

  6. bzoj 1211: [HNOI2004]树的计数 -- purfer序列

    1211: [HNOI2004]树的计数 Time Limit: 10 Sec  Memory Limit: 162 MB Description 一个有n个结点的树,设它的结点分别为v1, v2, ...

  7. prufer BZOJ1211: [HNOI2004]树的计数

    以前做过几题..好久过去全忘了. 看来是要记一下... [prufer] n个点的无根树(点都是标号的,distinct)对应一个 长度n-2的数列 所以 n个点的无根树有n^(n-2)种 树 转 p ...

  8. Luogu P2290 [HNOI2004]树的计数 Prufer序列+组合数

    最近碰了$prufer$ 序列和组合数..于是老师留了一道题:P2624 [HNOI2008]明明的烦恼 qwq要用高精... 于是我们有了弱化版:P2290 [HNOI2004]树的计数(考一样的可 ...

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

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

随机推荐

  1. [HDU1512]Monkey King(左偏树)

    用并查集维护猴子们的关系,强壮值用左偏树维护就行了 Code #include <cstdio> #include <algorithm> #include <cstri ...

  2. Java - 问题集 - 导出csv文件中文乱码

    微软的excel文件需要通过文件头的bom来识别编码,所以写文件时,需要先写入bom头. FileOutputStream fos = new FileOutputStream(new File(&q ...

  3. 使用LinqToExcel和EPPlus操作excel

    1.使用LinqToExcel LinqToExcel是一个.net framework平台下开源项目,它主要实现了LINQ的语法查询Excel电子表格.类型之前的LINQToXXX如果你是LINQ语 ...

  4. 商业地产 招商 招租 CRM 意向 洽谈 合同 复用商铺商户管理系统

    适用场合 本软件适合商业地产的对招商的全流程管理,包括商铺信息,商户信息,洽谈信息,意向签订,合同管理等. 软件有试用版可供下载试用. 联系方式 QQ:2417158658 Tel:130251102 ...

  5. beanshell引用参数化数据

    步骤: 1.添加参数化组件CSV Data Set  Config: 2.添加beanshell preprocessor,引用变量: 验证: 2个线程,迭代2次,分别取了4个不同的值.

  6. 第二十五篇 hashlib模块(* *)

    用于加密相关的操作,Python 3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法. 加密复杂程度: SHA1  ...

  7. Python简要标准库(3)

    shelve 若只需要一个简单的存储方案,那么shelve模块可以满足你大部分的需要,你所需要的只是为它提供文件名.shelve中唯一有趣的函数是open,在调用的时候他会返回一个Shelf对象 注意 ...

  8. Wordpress 设置后台自定义post 排序

    创建新的 Post type时,文章在后台默认使用 Titile 列进行升序排序,但是通常情况下我们需要按日期 Date 进行降序排序, function wpse_81939_post_types_ ...

  9. 图的同构 (Graph Isomorphism)

    整理摘自:https://www.jianshu.com/p/c33b5d1b4cd9 同构是在数学对象之间定义的一类映射,它能揭示出在这些对象的属性或者操作之间存在的关系.若这两个数学结构之间存在同 ...

  10. kaldi学习 - 一脚本流学习工具使用

    目录 yesno训练 先给出整体脚本如下: 分块详解 建立解码脚本 kaldi中脚本东西比较多,一层嵌一层,不易阅读. 本文以yesno为例,直接使用kaldi编译的工具,书写简易训练步骤,方便学习k ...