prufer编码
看51nod的一场比赛,发现不会大家都A的一道题,有关prufer的
我去年4月就埋下prufer这个坑,一直没解决
prufer编码是什么
对于一棵无根树的生成的序列,prufer序列可以和无根树一一对应,具体可以参见百科和poj2567和poj2568两个题。
prufer序列用来计数
- \(n\) 个点的无向完全图的生成树的个数为 \(n^{n-2}\) 。即prufer序列的长度为 \(n-2\),每个点的值是1 到 \(n\)
- \(n\) 个节点的度依次为 \(D_1\),\(D_2\),...,\(D_n\) 的无根树共有 \(\dfrac{(n-2)!}{\prod{(D_i-1)!}}\)。即第 \(i\) 个点出现了 \(D_i-1\) 次,变转换成问题:\(n\) 种元素,共 \(n-2\) 个,其中第 \(i\) 种元素有 \(D_i-1\) 个,求排列数。
- \(n\) 个节点的度数有的已知有的未知,假设有 \(m\) 个未知的,\(L=n-2-\sum{(D_i-1)}\) ,那么树的个数为 \(\dfrac{m^L(n-2)!}{L!\prod{(D_i-1)!}}\) ,参见
bzoj1005。
51nod1805
大意:\(n\) 个点生成的树,\(m\) 个叶子节点的方案数,\(n\leq 10^6\)
考虑这棵树的prufer序列,那么问题转化为长度为 \(n-2\) ,且在着 \(n-2\) 个数里面恰好出现了 \(n-m\) 个不同的数的方案数,就可以容斥一下解决了
inline int pw(int n,int m){int r=1;for(;m;m>>=1,n=1ll*n*n%MOD)if(m&1)r=1ll*r*n%MOD;return r;}
const int N=1e6+1;
int n,m,fac[N],fai[N];
void init(){
fac[0]=1;For(i,1,N)fac[i]=1ll*fac[i-1]*i%MOD;
fai[N-1]=pw(fac[N-1],MOD-2);
per(i,1,N-1)fai[i-1]=1ll*fai[i]*i%MOD;
}
inline int C(int n,int m){return 1ll*fac[n]*fai[m]%MOD*fai[n-m]%MOD;}
int main(){
init();
n=rd(),m=rd();
if(n==2&&m==2){puts("1");return 0;}
ll ans=0;
per(i,1,(n-m)){
ans+=((n-m-i&1)?-1ll:1ll)*C(n-m,i)*pw(i,n-2)%MOD;
}
ans=(ans%MOD+MOD)%MOD;
ans=ans*C(n,n-m)%MOD;
cout<<ans<<endl;
}
prufer编码的更多相关文章
- 树的prufer编码
prufer是无根树的一种编码方式,一棵无根树和一个prufer编码唯一对应,也就是一棵树有唯一的prufer编码,而一个prufer编码对应一棵唯一的树. 第一部分:树编码成prufer序列. 树编 ...
- 【转】prufer编码
既然有人提到了,就顺便学习一下吧,来源:http://greatkongxin.blog.163.com/blog/static/170097125201172483025666/ 一个含有n个点的完 ...
- [BZOJ1430] 小猴打架 (prufer编码)
Description 一开始森林里面有N只互不相识的小猴子,它们经常打架,但打架的双方都必须不是好朋友.每次打完架后,打架的双方以及它们的好朋友就会互相认识,成为好朋友.经过N-1次打架之后,整个森 ...
- Codeforces 1109D. Sasha and Interesting Fact from Graph Theory 排列组合,Prufer编码
原文链接https://www.cnblogs.com/zhouzhendong/p/CF1109D.html 题意 所有边权都是 [1,m] 中的整数的所有 n 个点的树中,点 a 到点 b 的距离 ...
- 图论:Prufer编码-Cayley定理
BZOJ1430:运用Cayley定理解决树的形态统计问题 由Prufer编码可以引申出来一个定理:Cayley 内容是不同的n结点标号的树的数量为n^(n-2) 换一种说法就是一棵无根树,当知道结点 ...
- 图论:Prufer编码
BZOJ1211:使用prufer编码解决限定结点度数的树的计数问题 首先学习一下prufer编码是干什么用的 prufer编码可以与无根树形成一一对应的关系 一种无根树就对应了一种prufer编码 ...
- [bzoj1005][HNOI2008]明明的烦恼-Prufer编码+高精度
Brief Description 给出标号为1到N的点,以及某些点最终的度数,允许在 任意两点间连线,可产生多少棵度数满足要求的树? Algorithm Design 结论题. 首先可以参考这篇文章 ...
- BZOJ 1430 小猴打架(prufer编码)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1430 [题目大意] 一开始森林里面有N只互不相识的小猴子,它们经常打架, 但打架的双方 ...
- 【Foreign】树 [prufer编码][DP]
树 Time Limit: 10 Sec Memory Limit: 256 MB Description Input Output Sample Input 3 2 2 1 Sample Outp ...
随机推荐
- python(2): If/for/函数/try异常/调试/格式输出%
(一) if if a1==a2: print('ok') if: else: if: elif: ... else: 注意缩进 猜数字游戏 from random import randint ...
- java web 项目中 简单定时器实现 Timer
java web 项目中 简单定时器实现 Timer 标签: Java定时器 2016-01-14 17:28 7070人阅读 评论(0) 收藏 举报 分类: JAVA(24) 版权声明:本文为博 ...
- mybatis 遍历map;
mybatis 遍历map; 参考http://blog.csdn.net/hj7jay/article/details/78652050 ps: ${m[key]}这是显示 打印的key读value ...
- php让一个数组按照另外一个数组的键名进行排序
$a = [ 'id', 'name', 'identityId', 'phone', 'email', 'schoolId' ]; $b = [ 'id' => '唯一标识', 'identi ...
- Ubuntu安装搜狗sougou输入法
昨天ubuntu闪屏后进不去系统,之后重新安装的Ubuntu14.04,在软件中心安装了新立得软件包管理器 在网上下载搜狗输入法forlinux 网址:http://pinyin.sogou.com/ ...
- Python_copy_深浅拷贝
对于数字和字符串来说,无论是‘’赋值‘’还是‘’深拷贝‘’还是‘’浅拷贝‘’都是指向的同一个地址 深浅拷贝是copy类下的方法,创建方式为 import copy copy.copy() #浅拷贝 c ...
- bat处理复制文件
1.建bat文件自动执行复制,删除命令. 复制cd.dll文件至windows\system32的bat文件内容: @echo offset JtlDir=D:\apache-jmeter-3.0\t ...
- net core体系-2继续认识net core
认识net core,net core到底啥?从哪说起呢?我想作为开发的码农,web项目不陌生吧,那就从对应的.net web 对应的net core Web Application项目开始吧. 下面 ...
- spark学习之路1--用IDEA编写第一个基于java的程序打包,放standalone集群,client和cluster模式上运行
1,首先确保hadoop和spark已经运行.(如果是基于yarn,hdfs的需要启动hadoop,否则hadoop不需要启动). 2.打开idea,创建maven工程.编辑pom.xml文件.增加d ...
- P1309 瑞士轮 排序选择 时间限制 归并排序
题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平,偶然性较低,但比赛过程往往十分 ...