2024FJCPC-H.萤火的意志-min-max容斥、Prufer序列(Cayley定理)、高维前缀和
题目:https://pintia.cn/market/item/1795304158332379136
题意:有一个
设
答案是
考虑
因此只要计算概率
要算选中至少一条边的概率,再容斥一下:设
转换成算某个边集所有边都被选中的概率,注意这里可千万别觉得好像“绕回去了”,一开始的问题是所有边都被选中的次数期望,这里被我们用两次容斥转换成了一个“简单”得多的概率问题。
这是经典的图连通计数,强制让
这样我们可以在
实现
注意点: 第二个容斥一定要记得
#include<bits/stdc++.h> #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0) using namespace std; typedef long long ll; const int MOD=1e9+7; const int M=20; int ksm(int a,int b){ int ret=1;a%=MOD; for(;b;b>>=1,a=(ll)a*a%MOD)if(b&1)ret=(ll)ret*a%MOD; return ret; } int n,m,u[M+1],v[M+1],f[(1<<M)+5],g[(1<<M)+5]; int fa[M*2+5],sz[M*2+5]; vector<int> b; int find(int x){ if(x==fa[x])return x; return fa[x]=find(fa[x]); } bool merge(int x,int y){ int fx=find(x),fy=find(y); if(fx==fy)return false; fa[fy]=fx; sz[fx]+=sz[fy]; return true; } void dsu_init(){ rep(i,0,b.size())fa[i]=i,sz[i]=1; } void add(int &x,int y){ x+=y; if(x>=MOD)x-=MOD; } int main(){ fastio; cin>>n>>m; rep(i,0,m-1){ cin>>u[i]>>v[i]; b.push_back(u[i]); b.push_back(v[i]); } sort(b.begin(),b.end()); b.erase(unique(b.begin(),b.end()),b.end()); rep(i,0,m-1){ u[i]=lower_bound(b.begin(),b.end(),u[i])-b.begin(); v[i]=lower_bound(b.begin(),b.end(),v[i])-b.begin(); } for(int S=0;S<(1<<m);S++){ dsu_init(); bool ok=true; rep(i,0,m-1)if((S>>i)&1)ok&=merge(u[i],v[i]); if(!ok)f[S]=0; else{ f[S]=1; int block=n-b.size(); rep(i,0,b.size()-1)if(find(i)==i){ block++; f[S]=(ll)f[S]*sz[i]%MOD; } f[S]=(ll)f[S]*ksm(ksm(n,n-block),MOD-2)%MOD; if((__builtin_popcount(S)&1)==0)f[S]=MOD-f[S]; } g[S]=f[S]; } rep(j,0,m-1)rep(S,0,(1<<m)-1)if(S>>j&1)add(f[S],f[S^(1<<j)]); rep(S,0,(1<<m)-1)add(f[S],MOD-g[0]); rep(S,0,(1<<m)-1)f[S]=ksm(f[S],MOD-2); int ans=0; rep(S,0,(1<<m)-1){ if(__builtin_popcount(S)&1)add(ans,f[S]); else add(ans,MOD-f[S]); } cout<<ans; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2022-05-29 [面向对象课]复数的输入输出