题意:有n个点和m条限制,每条限制限制了一个点的度数不能为某个数。

求合法的树的个数模10^9+7

n<=10^6

m<=17

思路:WYZ作业

首先m<=17显然是2^m容斥

枚举每一个限制有用或没用,考虑某一个约束情况下的方案数

Caylay定理:n个点的生成树的个数=n^(n-2)

Prufer序列:一个长度为n-2的Prufer序列对应唯一的一棵n个节点的树,度数为a[i]的点在其中出现了(a[i]-1)次

考虑先在序列中填上所有的受约束条件的点,它们的方案数是C(n-2,a[1]-1)*C(n-2-(a[1]-1),a[2]-1)*……

化简得:

(n-2)!/((a[1]-1)!(a[2]-1)!……*(n-2-sigma(a[i]-1))!)

考虑没有约束的点可以随意在剩下的序列中出现,它们的方案数为:

(n-p)^(n-2-sigma(a[i]-1))

其中p为选中的约束条件个数

将两部分相乘,根据p的奇偶性进行容斥计算即可

几个hack点:

1.对于同一个点可能会有多个约束条件,需要判断某一个点是否被多次限制,如果被多次限制就不能计入答案

2.n=1需要特判ans=1(真的吗,这个点可是坑了我5点头盾)

 const mo=;
var flag:array[..]of longint;
fac,exf:array[..]of int64;
a,b,c:array[..]of longint;
n,m,i:longint;
sun:int64; function mult(x,y:longint):int64;
var tmp:int64;
begin
tmp:=x; mult:=;
while y> do
begin
if y and = then mult:=mult*tmp mod mo;
tmp:=tmp*tmp mod mo;
y:=y>>;
end;
end; procedure dfs(k:longint);
var i,j,tot,sum:longint;
ans:int64;
begin
if k=m+ then
begin
tot:=; ans:=fac[n-]; sum:=n-;
for i:= to m do
if c[i]> then
begin
inc(tot);
inc(flag[a[i]]);
sum:=sum-(b[i]-);
end;
for i:= to m do
if (c[i]>)and(flag[a[i]]>) then
begin
for j:= to m do
if c[j]> then dec(flag[a[j]]);
exit;
end;
for i:= to m do
if c[i]> then ans:=ans*exf[b[i]-] mod mo;
//writeln(sum);
if sum>= then
begin
ans:=ans*exf[sum] mod mo;
ans:=ans*mult(n-tot,sum) mod mo;
if tot and = then sun:=(sun+ans) mod mo
else sun:=(sun-ans) mod mo;
sun:=(sun+mo) mod mo;
end;
for i:= to m do
if c[i]> then dec(flag[a[i]]);
exit;
end;
if b[k]= then dfs(k+)
else
begin
c[k]:=;
dfs(k+);
c[k]:=;
dfs(k+);
end;
end; begin
assign(input,'51nod1806.in'); reset(input);
assign(output,'51nod1806.out'); rewrite(output);
readln(n,m);
if n= then
begin
writeln();
exit;
end;
for i:= to m do read(a[i],b[i]);
exf[]:=; exf[]:=; fac[]:=;
for i:= to do fac[i]:=fac[i-]*i mod mo;
for i:= to do exf[i]:=exf[mo mod i]*(mo-mo div i) mod mo;
for i:= to do exf[i]:=exf[i-]*exf[i] mod mo;
dfs();
writeln(sun);
close(input);
close(output);
end.

【51NOD1806】wangyurzee的树(Prufer编码,容斥原理,组合计数)的更多相关文章

  1. 【Foreign】树 [prufer编码][DP]

    树 Time Limit: 10 Sec  Memory Limit: 256 MB Description Input Output Sample Input 3 2 2 1 Sample Outp ...

  2. 「模拟赛20180406」膜树 prufer编码+概率

    题目描述 给定一个完全图,保证\(w_{u,v}=w_{v,u}\)且\(w_{u,u}=0\),等概率选取一个随机生成树,对于每一对\((u,v)\),求\(dis(u,v)\)的期望值对\(998 ...

  3. 树的Prufer 编码和最小生成树计数

      Prufer数列 Prufer数列是无根树的一种数列.在组合数学中,Prufer数列由有一个对于顶点标过号的树转化来的数列,点数为n的树转化来的Prufer数列长度为n-2.它可以通过简单的迭代方 ...

  4. BSOJ 5553 wangyurzee的树 prufer序列 容斥

    BSOJ我也不知道在哪. 容易想到容斥. 考虑不合法的方案 想到强制某个点的度数为限制即可. 这样就变成了了总方案-一个不合法+两个不合法-3个......的模型了. 坑点 当强制两个相同的点时 方案 ...

  5. HDU 4390 Number Sequence (容斥原理+组合计数)

    HDU 4390 题意: 大概就是这样.不翻译了: Given a number sequence b1,b2-bn. Please count how many number sequences a ...

  6. 【BZOJ 3027】 3027: [Ceoi2004]Sweet (容斥原理+组合计数)

    3027: [Ceoi2004]Sweet Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 71  Solved: 34 Description John ...

  7. 51nod 1806 wangyurzee的树

    基准时间限制:1 秒 空间限制:131072 KB    wangyurzee有n个各不相同的节点,编号从1到n.wangyurzee想在它们之间连n-1条边,从而使它们成为一棵树.可是wangyur ...

  8. Luogu2290 [HNOI2004]树的计数 (组合计数,prufer编码)

    这不prufer编码吗,防爆long long就行了啊 #include <iostream> #include <cstdio> #include <cstring&g ...

  9. BZOJ1005--[HNOI2008]明明的烦恼(树的prufer编码)

    1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5768  Solved: 2253[Submit][Stat ...

  10. 树的prufer编码

    prufer是无根树的一种编码方式,一棵无根树和一个prufer编码唯一对应,也就是一棵树有唯一的prufer编码,而一个prufer编码对应一棵唯一的树. 第一部分:树编码成prufer序列. 树编 ...

随机推荐

  1. 1272 最大距离 只想到了dp

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1272 离散化后,用dp[i]表示向右,大于等于i这个数字的最大位置 dp ...

  2. 前端--1、HTML基础

    web服务 处于应用层的http协议负责的数据传输与解析.位于socket上层,用socket传输http数据时需要在消息开头处声明是http协议/相应http版本 状态码 状态码含义 \r\n\r\ ...

  3. 轻松搞定Spring+quartz的定时任务

    1.spring 的定时任务写法有两种:一种是继承工作类,一种是普通的Bean,定时写法有两种写法:一种是以时间间隔启动任务SimpleTriggerBean,一种是以时刻启动任务CronTrigge ...

  4. html5开发移动混合App系列2-开发环境搭建(windows)

    Java下载: http://www.oracle.com/technetwork/java/javase/downloads/index.html 环境变量: JAVA_HOME=C:\Progra ...

  5. linux 10201 ASM RAC 安装+升级到10205

    准备环境的时 ,要4个对外IP,2个对内IP 不超过2T,,一般都用OCFS 高端存储适合用ASM linux10G安装的时候,安装的机器时间要小于等于(如果是等于要严格等于)第二个机器的时间(只有l ...

  6. h5编写帧动画

    var requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame; var ...

  7. CAD参数绘制文字(com接口)

    在CAD设计时,需要绘制文字,用户可以设置设置绘制文字的高度等属性. 主要用到函数说明: _DMxDrawX::DrawText 绘制一个单行文字.详细说明如下: 参数 说明 DOUBLE dPosX ...

  8. spark版本不支持(降版本打包)

    在做项目的时候代码已经更新为hadoop 2.7  spark 2.1 scala 2.11.8版本,但是服务器版本使用的是hadoop2.6 spark1.6 以及scala2.10.6版本,,主程 ...

  9. C++暂停黑窗口

    C++中采用system("pause");来暂停黑窗口,那么操纵系统就会将窗口暂停,显示“请按任意键继续. . .” 我们用VS执行代码是,若直接按键盘的F5(开始调试),那么窗 ...

  10. BZOJ2212【POI2011】ROT:Tree Rotation 线段树合并

    题意: 给一棵n(1≤n≤200000个叶子的二叉树,可以交换每个点的左右子树,要求叶子遍历序的逆序对最少. 分析: 求逆序对我们可以想到权值线段树,所以我们对每个点建一颗线段树(为了避免空间爆炸,采 ...