NOI Online 游戏 树形dp 广义容斥/二项式反演
LINK:游戏
还是过于弱鸡 没看出来是个二项式反演,虽然学过一遍 但印象不深刻。
二项式反演:有两种形式 一种是以恰好和至多的转换 一种是恰好和至少得转换。
设\(f_i\)表示至多的方案数 \(g_i\)表示恰好的方案。
则有 \(f_n=\sum_{i=0}^nC(n,i)\cdot g_i\) 根据二项式反演则有 \(g_n=\sum_{i=0}^n(-1)^{n-i}\cdot C(n,i)\cdot f_i\)
设\(f_i\)表示至少的方案数 \(g_i\)表示恰好的方案。
则有 \(f_k=\sum_{i=k}^nC(i,k)\cdot g_i\) 根据二项式反演则有 \(g_k=\sum_{i=k}^n(-1)^{i-k}\cdot C(i,k)\cdot f_i\)
剩下的树形dp还是很容易想的。
题目意思是在所有的局面下 不为平局的状态数量。
爆搜复杂度过高。容易发现每次匹配都是在自己和自己的子树内部进行匹配的。
而且匹配是没有顺序的所以对于某种匹配我们直接让其和其子树内部的东西进行匹配即可。
设状态 f[i][j]表示以i为根的子树内部有j个非平局的状态数。
转移很简单 不过这里面有一个小trick 注意枚举到自己的子树大小 还有不要先加上儿子的数量再枚举 这样复杂度都不是n^2的。
只是枚举到自己的子树大小之后 可以发现任意两个点对在自己的LCA处被枚举了一遍 所以复杂度n^2.
最后有一个自己跟自己匹配的决策转移。
值得一题的是 对于有j个非平局的 剩下的点还没有被匹配 显然 方案数为 (m-j)!.
到这里 就会发现端倪 这个f状态有问题 其不是恰好 而是至少。
求出所有的f值之后套一个二项式反演就可以得到至少得方案数了。
const ll MAXN=5010,G=3;
ll n,len ;
char a[MAXN];
ll fac[MAXN],inv[MAXN];
ll sz[MAXN][2],w[MAXN],f[MAXN][MAXN];//f[i][j]表示以i为根的子树内至少有j个非平衡的回合数的情况数
ll lin[MAXN],g[MAXN],ver[MAXN<<1],nex[MAXN<<1];
inline void add(ll x,ll y)
{
	ver[++len]=y;
	nex[len]=lin[x];
	lin[x]=len;
}
inline void dfs(ll x,ll fa)
{
	sz[x][a[x]-'0']=1;
	f[x][0]=1;
	go(x)
	{
		if(tn==fa)continue;
		dfs(tn,x);
		ll w1=min(sz[x][1],sz[x][0]);
		ll w2=min(sz[tn][1],sz[tn][0]);
		for(ll j=0;j<=w1;++j)
			for(ll k=0;k<=w2;++k)g[j+k]=(g[j+k]+f[x][j]*f[tn][k])%mod;
		sz[x][1]+=sz[tn][1];
		sz[x][0]+=sz[tn][0];
		rep(0,w1+w2,j)f[x][j]=g[j],g[j]=0;
	}
	ll w1=min(sz[x][0],sz[x][1]);
	fep(w1-1,0,i)f[x][i+1]=(f[x][i+1]+f[x][i]*(sz[x][(a[x]-'0')^1]-i))%mod;
}
inline ll ksm(ll b,ll p)
{
	ll cnt=1;
	while(p)
	{
		if(p&1)cnt=cnt*b%mod;
		b=b*b%mod;p=p>>1;
	}
	return cnt;
}
inline ll C(ll a,ll b){if(a<b)return 0;return fac[a]*inv[b]%mod*inv[a-b]%mod;}
inline void calc()
{
	rep(0,n/2,i)
		rep(i,n/2,j)w[i]=(w[i]+((((j-i)&1))?-1:1)*C(j,i)*g[j])%mod;
}
signed main()
{
	freopen("match.in","r",stdin);
	freopen("match.out","w",stdout);
	gt(n);gc(a);fac[0]=fac[1]=1;
	rep(2,n,i)
	{
		ll get(x),get(y);
		fac[i]=fac[i-1]*i%mod;
		add(x,y);add(y,x);
	}
	inv[n]=ksm(fac[n],mod-2);
	fep(n-1,0,i)inv[i]=inv[i+1]*(i+1)%mod;
	dfs(1,0);
	rep(0,n/2,i)g[i]=f[1][i]*fac[n/2-i]%mod;
	calc();
	//putl(f[1][1]);
	rep(0,n/2,i)printf("%lld ",((w[i]+mod)%mod));
	return 0;
}
												
											NOI Online 游戏 树形dp 广义容斥/二项式反演的更多相关文章
- 青云的机房组网方案(简单+普通+困难)(虚树+树形DP+容斥)
		
题目链接 1.对于简单的版本n<=500, ai<=50 直接暴力枚举两个点x,y,dfs求x与y的距离. 2.对于普通难度n<=10000,ai<=500 普通难度解法挺多 ...
 - 【题解】[HAOI2018]染色(NTT+容斥/二项式反演)
		
[题解][HAOI2018]染色(NTT+容斥/二项式反演) 可以直接写出式子: \[ f(x)={m \choose x}n!{(\dfrac 1 {(Sx)!})}^x(m-x)^{n-Sx}\d ...
 - loj#2542. 「PKUWC2018」随机游走(树形dp+Min-Max容斥)
		
传送门 首先,关于\(Min-Max\)容斥 设\(S\)为一个点的集合,每个点的权值为走到这个点的期望时间,则\(Max(S)\)即为走遍这个集合所有点的期望时间,\(Min(S)\)即为第一次走到 ...
 - 51nod 1518 稳定多米诺覆盖(容斥+二项式反演+状压dp)
		
[传送门[(http://www.51nod.com/Challenge/Problem.html#!#problemId=1518) 解题思路 直接算不好算,考虑容斥,但并不能把行和列一起加进去容斥 ...
 - LuoguP3047 [USACO12FEB]附近的牛Nearby Cows(树形DP,容斥)
		
\[f[u][step] = \begin{cases} C[u] & step = 0 \\ (\sum{f[v][step - 1]}) - f[u][step - 2] \cdot (d ...
 - 【BZOJ3622】已经没有什么好害怕的了(动态规划+广义容斥)
		
点此看题面 大致题意: 有\(n\)个糖果和\(n\)个药片,各有自己的能量.将其两两配对,求糖果比药片能量大的组数恰好比药片比糖果能量大的组数多\(k\)组的方案数. 什么是广义容斥(二项式反演) ...
 - BZOJ2839 : 集合计数 (广义容斥定理)
		
题目 一个有 \(N\) 个 元素的集合有 \(2^N\) 个不同子集(包含空集), 现在要在这 \(2^N\) 个集合中取出若干集合(至少一个), 使得它们的交集的元素个数为 \(K\) ,求取法的 ...
 - P2016 战略游戏——树形DP大水题
		
P2016 战略游戏 树形DP 入门题吧(现在怎么是蓝色标签搞不懂): 注意是看见每一条边而不是每一个点(因为这里错了好几次): #include<cstdio> #include< ...
 - P4491 [HAOI2018]染色 广义容斥 NTT 生成函数
		
LINK:染色 算是比较常规的广义容斥. 算恰好k个 可以直接转成至少k个. 至少k个非常的好求 直接生成函数. 设\(g_k\)表示至少有k个颜色是满足的 那么有 \(g_k=C(m,k)\frac ...
 
随机推荐
- 二、web自动化快速使用
			
1.启动浏览器 from selenium import webdriver # 启动谷歌浏览器,依赖:先安装好chromedriver.exe驱动 # 方式1.当chrome.driver放在p ...
 - HTML5(一)初识HTML5
			
HTML5 简介 HTML5是HTML最新的修订版本,2014年10月由万维网联盟(W3C)完成标准制定. 目的是为了在移动设备上支持多媒体. HTML5 的改进 完全支持 CSS3 Video 和 ...
 - 「疫期集训day0」启程
			
看了看几乎所有学长都是写的博客,所以写的博客 由于是第一回集训,考得都是老题(虽然有些还不会) 感受1:我调试好蒻呃,调试巨蒻,T1lis模板5分切,结果T2T3T4调了将近了两个小时,先是T2路径输 ...
 - flex-direction和flex-wrap
			
当外层容器使用flex布局,并且把flex-direction设置成colum的时候,内层容器的宽度会跟外层容器的宽度保持一致. 在浏览器上的效果如下: 当把外层容器的纵向布局不适用flex-dire ...
 - php 修改图片大小
			
<?php set_time_limit(0);ini_set("memory_limit","500M");$dir = dir('./');while ...
 - 执行ArrayList的remove(object)方法抛异常?
			
简介 或许有很多小伙伴都尝试过如下的代码: ArrayList<Object> list = ...; for (Object object : list) { if (条件成立) { l ...
 - shell专题(八):read读取控制台输入
			
1.基本语法 read(选项)(参数) 选项: -p:指定读取值时的提示符: -t:指定读取值时等待的时间(秒). 参数 变量:指定读取值的变量名 2.案例实操 (1)提示7秒内,读取控制台输入的名称 ...
 - Python模块04/包/logging日志
			
Python模块04/包/logging日志 目录 Python模块04/包/logging日志 内容大纲 1.包 2.logging日志 3.今日总结 内容大纲 1.包 2.logging日志 1. ...
 - 适用于IE8浏览器的bootsarp下拉菜单(支持多选,全选)
			
html部分代码,引用及整体项目Github项目地址:https://github.com/CNbozi/combobox 1 <!DOCTYPE html> <html lang= ...
 - 【面试题资源共享】一文总结最高频软件测试|sq|语句|思维发散|计算机基础|Linux|测试用例|接口测试|等技术面试题
			
思维发散 1.一个球, -把尺子长度是球直径的2/3,怎样测出半径?2.四枚硬币,花面朝上,每次翻转三个,几次可以将四枚硬币变为字面朝上?3. U2合唱团在1 7分钟内赶到演唱会现场问题?4.小明一家 ...