ABC149F
ABC149F
*2208
题意
给定一个
题解
一开始以为是妙妙 DP,推了很久转移。后面发现是正难则反,对于每个点算贡献。
考虑一个点在什么情况下 不会 被记入答案。一种情况是其本身是黑点,不会直接贡献答案,一种情况则是其不被任何一个连通块包含。
对于不被任何一个连通块包含的情况,只有两种可能:一种是全部的黑点都在它的其中一个子树中(这里暂时把它看做根),一种是没有黑点。
设
最后累加所有点的贡献即为答案。
代码
const ll maxn=2e5+5,mod=1e9+7;
vector<ll>e[maxn];
ll ksm(ll x,ll k){ll res=1;for(;k;k>>=1,x=x*x%mod)if(k&1)res=res*x%mod;return res;}
ll n;
ll ans;
ll inv[maxn],siz[maxn];
ll neg(ll x){
return mod-x;
}
void dfs(ll x,ll fa){
ll res=1;
siz[x]=1;
res=(res+neg(inv[n-1]))%mod;
for(auto v:e[x]){
if(v==fa)continue;
dfs(v,x);
siz[x]+=siz[v];
res=(res+neg((inv[n-siz[v]-1]+neg(inv[n-1]))%mod))%mod;
}
res=(res+neg((inv[siz[x]-1]+neg(inv[n-1]))%mod))%mod;
res=res*inv[1]%mod;
ans=(ans+res)%mod;
return ;
}
void solve(){
n=R;
inv[0]=1,inv[1]=ksm(2,mod-2);
for(ll i=2;i<=n;i++)inv[i]=inv[i-1]*inv[1]%mod;
for(ll i=1;i<n;i++){
ll x=R,y=R;
e[x].push_back(y);
e[y].push_back(x);
}
dfs(1,0);
we(ans);
return ;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现