首页 > 其他分享 >CF1824B2 LuoTianyi and the Floating Islands (Hard Version) - 概率期望 - 树的重心 -

CF1824B2 LuoTianyi and the Floating Islands (Hard Version) - 概率期望 - 树的重心 -

时间:2023-05-09 17:14:22浏览次数:55  
标签:LuoTianyi return int inv Hard 1ll Version maxn mod

题目链接:https://codeforces.com/contest/1824/problem/B2

题解:
考虑一棵 \(n\) 个点的树,假如已经选定了 \(k\) 个特殊点,如何判断某一个点是否为好点?
显然将这个点提到根没有影响,那么好点的充要条件是对于所有子树的 \(S_u\) 值都 \(\leq k/2\),这里 \(S\) 代表 \(u\) 子树中的特殊点的个数
证明完全可以考虑重心,只不过这里根可能不是特殊点(如果是特殊点的话,直接把所有非特殊点删去,和重心完全一样),可以发现不影响证明(可以将这个非特殊点合并到相邻的特殊点上,然后删去非特殊点)
这样,我们就找到了一个点是好点的条件。现在考虑对于任意的 \(k\) 个点
考虑指定某一点为根,这里有一个很妙的操作:指定根之后就可以将点的贡献拆到这个点与父亲的边上了。考虑一个边是否为“好边”,显然判断方法就看这条边左边的树的 \(S\) 值是否和右边的 \(S\) 一样,都是 \(k/2\)(由于 \(\leq k/2\),且只有两个部分,那么肯定都得相等),也就是说这个边是好边的概率是

\[p_{u,v}=\frac{C_{S_u}^{k/2}\times C_{n-S_v}^{k/2}}{C_n^k} \]

注意好边的定义是两边的点都是好点,因此期望点的个数期望好边的个数 +1,也就是 \(1+\sum p\)

代码:

// by SkyRainWind
#include <bits/stdc++.h>
#define mpr make_pair
#define debug() cerr<<"Yoshino\n"
#define pii pair<int,int>
#define pb push_back

using namespace std;

typedef long long ll;
typedef long long LL;

const int inf = 1e9, INF = 0x3f3f3f3f, mod = 1e9+7, maxn = 2e5+5;

int fac[maxn], inv[maxn],inv2;
vector<int>g[maxn];

int pw(int x,int y){
	if(!y)return 1;
	if(y == 1)return x;
	int mid=pw(x,y>>1);
	if(y&1)return 1ll*mid*mid%mod*x%mod;
	return 1ll*mid*mid%mod;
}

int C(int x,int y){
	if(x < y)return 0;
	return 1ll*fac[x]*inv[y]%mod*inv[x-y]%mod;
}

int sz[maxn];

int ans = 0, iv; 
void dfs(int x,int fat=0){
	sz[x] = 1;
	for(int u : g[x])if(u != fat){
		dfs(u, x);
		sz[x] += sz[u];
	}
}

signed main(){
	inv2=pw(2,mod-2);
	fac[0] = inv[0] = 1;
	for(int i=1;i<=maxn-5;i++)fac[i] = 1ll*fac[i-1]*i%mod;
	inv[maxn-5] = pw(fac[maxn-5], mod-2);
	for(int i=maxn-6;i>=1;i--)inv[i] = 1ll*inv[i+1]*(i+1)%mod;
	
	int n,k;
	scanf("%d%d",&n,&k);
	for(int i=1;i<n;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		g[x].pb(y), g[y].pb(x);
	}
	
	if(k %2 == 1){
		puts("1");
		return 0;
	}
	
	dfs(1);
	iv = pw(C(n,k), mod-2);
	for(int i=1;i<=n;i++)
		(ans += 1ll * C(sz[i], k/2) * C(n-sz[i], k/2)%mod) %= mod;
	printf("%d\n",(1ll * ans * iv + 1) % mod);
	
	return 0;
}

标签:LuoTianyi,return,int,inv,Hard,1ll,Version,maxn,mod
From: https://www.cnblogs.com/SkyRainWind/p/17385633.html

相关文章

  • 达梦数据库使用ShardingSphere
     ShardingSphere只支持主流数据库,国产的数据库并不支持,就比如达梦数据库,所以我们自己扩展。1.下载shardingsphere源码下载地址:https://github.com/apache/shardingsphere进入网址后,选择自己使用的Tags分支,并下载代码。我使用的版本是4.0.0-RC2再下载代码,......
  • You have an error in your SQL syntax; check the manual that corresponds to your
    问题描述显示在条件查询的sql语句那里报错问题解决本来我是习惯了使用servlet写数据库操作的,然后就直接忽略掉了,或者说,直接忘记了在jsp里面的sql语句怎么正确书写了;经过查阅资料发现,查询语句是这样写的:Stringsql="select*frombookwhereid="+id;......
  • CF1825C LuoTianyi and the Show
    传送门(luogu)传送门(CF)前言我来水题解力简化题意$n$个人,$m$个座位,每个人落座的方法有三种:坐最左边的人的左边,没人的话就做$m$号座位,若最左边的为$1$号,就离开;坐最右边的人的右边,没人的话就做$1$号座位,若最右边的为$m$号,就离开;坐在$x_i$号座位上,有人就......
  • 拉格朗日反演公式(lagrange inversion)组合证明
    Thereisasimplecombinatorialproof.Theoriginalformis\[[t^n]w^k=\frac{k}{n}[t^{n-k}]\phi^k\]where\(w=t\phi(w)\)consider\(w\)asegf.ofthewaysofsometrees.\(\phi\)asageneratingruleconcerningdegree.\[n![x^n]\frac{w^k}{k......
  • 解决Could not find a version that satisfies the requirement思路
    安装python第三方库的时候会提示报错缺少依赖库,报错如下:ERROR:Couldnotfindaversionthatsatisfiestherequirement 模块名(fromautomat)(fromversions:none)ERROR:Nomatchingdistributionfoundfor模块名下图为有具体提示缺少的依赖库的版本信息: 下图则为......
  • typora:The beta version of typora is expired, please download and install a newe
    该解决方案摘录自:摘录问题描述typora安装后提示Thebetaversionoftyporaisexpired,pleasedownloadandinstallanewerversion解决方案按Windows+R打开运行窗口,输入regedit,点确定,打开注册表,依次展开计算机\HKEY_CURRENT_USER\Software\Typora,然后在Typora上右键,点......
  • MongoDB中缩减Shard集群(删除一个Shard)--删除一个分片
    关键字:MongoDB中缩减Shard集群(删除一个Shard)--删除一个分片对MongoDB的Shard集群来说,添加一个分片很简单,AddShard就可以了。但是缩减集群(删除分片)这种一般很少用到。由于某服务器挂了,所以想送修之前必须把它上面的数据自动迁移到其他Shard上。以下......
  • OrchardCore 中的 插件开发/ Shape / DisplayDriver / 视图扩展 / Razor代码注入
    请注意该文章仅限于OrchardCore项目中的DisplayDriver扩展机制,ASP.NETCOREMVC自身并没有对应功能,如果需要可以将相关的OrchardCore模块添加到项目中也可以实现响应功能背景最近一个功能需求,需要使用其它用户模拟身份,所以计划在用户列表页面扩展按钮组功能那么开始看代......
  • ERROR: Could not find a version that satisfies the requirement cv2 (from version
    现象导入cv2时,报如下的错误ERROR:Couldnotfindaversionthatsatisfiestherequirementcv2(fromversions:none)解决方案win+R打开命令行,输入 pipinstallopencv-python,下载opencv,等待下载完成即可。下载有点慢,耐心等待一下。 ......
  • register at least one qt version using“qt vs tools“->“qt options“问题描述及解
    问题描述:在安装了Qt5.9.8,vs2022,QTVSTool2022并配置好环境变量之后创建Qt项目时无法创建,提示至少需要注册一个Qt版本到QtVSTools的QtOptions 解决方法:1.重新打开一个可以创建的C++vs文件,在上方菜单栏中“工具-选项-找到Qt的version”,点击加号,再点击windows右侧的......