题解:AT_arc165_e [ARC165E] Random Isolation
LastKismet · · 题解
Sol
不是很简单吧。
考虑可以对一个连通块统计其出现的概率,那么每一个大小超过
一个连通块出现,当且仅当连通块内各点均未被删除,且与连通块相连的非块内点均已被删除。考虑 DP,记
考虑如何计算已知这些限制后这样一个连通块的概率,一个巧妙的转化是,原问题等价于一个
因此相当于一个任意排列上要求
Code
const int N=105;
int n,k;
int sz[N];
mint fc[N],iv[N];
mint f[N][N][N];
mint t[N][N];
vec<int> g[N];
mint ans;
inline void dfs(int x=1,int fa=0){
f[x][1][0]=1;sz[x]=1;
for(auto y:g[x])if(y!=fa){
dfs(y,x);
f[y][0][1]=1;
memset(t,0,sizeof t);
rep(i,0,sz[x])rep(j,0,sz[x])rep(k,0,sz[y])rep(l,0,sz[y])t[i+k][j+l]+=f[x][i][j]*f[y][k][l];
sz[x]+=sz[y];
rep(i,0,sz[x])rep(j,0,sz[x])f[x][i][j]=t[i][j];
}
auto getans=[&](int a,int b){return fc[a]*fc[b]*iv[a+b];};
rep(i,k+1,sz[x])rep(j,0,sz[x])ans+=getans(i,j+!!fa)*f[x][i][j];
}
inline void Main(){
cin>>n>>k;
fc[0]=1;rep(i,1,n)fc[i]=fc[i-1]*i;
iv[n]=1/fc[n];per(i,n,1)iv[i-1]=iv[i]*i;
repl(i,1,n){
int a,b;cin>>a>>b;
g[a].pub(b),g[b].pub(a);
}
dfs();
put(ans);
}