【题解】CF1667E-Centroid Probabilities
求对于所有大小为 的树,满足每个结点 向小于 的点连恰好一条边,对于每个点 求出有多少颗树以 为重心。
有一个非常妙的转化,我们求出 表示以 为根的子树大小 的方案,那么 为重心的方案就是 种方案中子树中所有点子树大小 的方案。
也就是如果我们求出了 ,那么就可以容斥出 ,其中
这个式子意义是用 ,减去重心出现在子树里的方案,每一个出现在子树里的方案,我们记重心为 ,它第一个 的祖先是 ,那么所有 的方案是相同的。
那么怎么求出 ,直接枚举 表示 的子树大小,式子就是若干个阶乘,算一算即可。我们令
这样就可以 算出答案。
#define N 200005
int n, s, m, fac[N], inv[N], iv[N], ed[N];
int main() {
read(n), m = n / 2 + 1;
fac[0] = 1; rp(i, n)fac[i] = fac[i - 1] * 1LL * i % P;
inv[n] = Pow(fac[n], P - 2); pr(i, n)inv[i - 1] = inv[i] * 1LL * i % P;
iv[1] = 1; rep(i, 2, n)iv[i] = P - iv[P % i] * 1LL * (P / i) % P;
pr(i, n - m + 1){
int w = fac[n - i] * 1LL * fac[n - m] % P * inv[n - i - m + 1] % P;
su(w, iv[i] * 1LL * s % P);
ed[i] = w, ad(s, w);
}
rp(i, n)printf("%d ", ed[i]); el;
return 0;
}
作者:7KByte
出处:https://www.cnblogs.com/7KByte/p/16249309.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】