CF1824B1 LuoTianyi and the Floating Islands (Easy Ver.) 题解
前言
这场的 C 把我蓝名搞没了,这么简单的 D1 居然没看……
解法
如果
现在考虑
首先有个性质,连接选定的
考虑如何借助这个性质解题;尝试对于每个岛处理,如果令这个岛(设为
那么,问题来了:如果不考虑
显然的,
时间复杂度
放代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e9+7;
int qpow(int a,int b){
int r=1;
while(b){
if(b&1)r=r%mod*a%mod;
a=a%mod*a%mod; b>>=1;
}
return r;
} // 快速幂,求逆元用
vector<int> g[200001];
int n,e[200001],w[200001];
// e[i] 为子树大小,w[i] 即为平方和
void dfs(int u,int r){
e[u]=1;
for(int i:g[u])
if(i!=r){
dfs(i,u),e[u]+=e[i];
(w[u]+=e[i]*e[i]%mod)%=mod;
}
(w[u]+=(n-e[u])*(n-e[u])%mod)%=mod;
// 计算出 w[i]
}
main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int k,c=0; cin>>n>>k;
if(k&1)cout<<"1\n"; // 答案必为 1
else{
for(int i=1;i<n;i++){
int u,v; cin>>u>>v;
g[u].emplace_back(v);
g[v].emplace_back(u);
}
dfs(1,0); // 一遍 dfs
for(int i=1;i<=n;i++)
(c+=((n-1)*(n-1)%mod-w[i]+mod)%mod*qpow(2,mod-2)%mod)%=mod; // 算概率
cout<<(c%mod*qpow(n*(n-1)/2%mod,mod-2)%mod+2)%mod<<endl;
// 记得加上 2 的贡献(即 x 在链的一端的时候的贡献)
}
return 0;
}