首页 > 其他分享 >Codeforces 1667E Centroid Probabilities

Codeforces 1667E Centroid Probabilities

时间:2024-01-25 15:56:33浏览次数:18  
标签:frac Probabilities sum times i64 int 1667E Centroid mod

这个连边方式就可以理解为 \(1\) 为根,点 \(u\) 的父亲 \(fa_u\) 满足 \(fa_u < u\)。

重心有不止一种表示法,考虑用“子树 \(siz\ge \lceil\frac{n}{2}\rceil\) 最深的点”来表示重心。

令 \(m = \lceil\frac{n}{2}\rceil\),\(f_i\) 为节点 \(i\) 的 \(siz\ge m\) 的方案数。
考虑枚举 \(siz = j\) 最后求和。
首先要从 \(i + 1\sim n\) 中选出 \(j\) 个点,\(\binom{n - i}{j - 1}\)。
对于子树内非 \(i\) 的节点的父亲就只能是子树的点,又因为 \(fa_u < u\),方案数为 \((j - 1)!\)。
子树外的节点的父亲就不能是子树的点,因为同样的限制,方案数 \((n - j - 1)!\)。
对于 \(i\) 自己就可以选择 \(1\sim i - 1\) 的点作为 \(fa_i\),方案数 \(i - 1\)。
于是有:
\(f_i = \sum\limits_{i = m}^n \binom{n - i}{j - 1}\times (j - 1)!\times (n - j - 1)!\times (i - 1)\)
\(= \sum\limits_{i = m}^n \frac{(n - i)!}{(n - i - j + 1)!}\times (n - j - 1)!\times (i - 1)\)
\(= (n - i)! \times (i - 1)\sum\limits_{i = m}^n \frac{(n - j - 1)!}{(n - i - j + 1)!}\)
\(= (n - i)! \times (i - 1)!\sum\limits_{i = m}^n \frac{(n - j - 1)!}{(n - i - j + 1)!(i - 2)!}\)
\(= (n - i)! \times (i - 1)!\sum\limits_{i = m}^n \binom{n - j - 1}{i - 2}\)
\(= (n - i)! \times (i - 1)!\times \binom{n - m}{i - 1}\)
于是就可以 \(O(1)\) 算出 \(f_i\) 了。

但是还没有保证最深这个限制,考虑若 \(sz_i\ge m\),其不是重心时重心肯定在其子树内。
因为如果在祖先节点肯定不可能,因为 \(i\) 更深;否则两个点对应的子树无交集,且都满足 \(sz\ge m\),那么两颗子树的 \(sz\) 和 \(\ge 2m = 2\lceil\frac{n}{2}\rceil\),因为 \(n\bmod 2 = 1\),所以 \(2\lceil\frac{n}{2}\rceil > n\),一定不可能。

于是令 \(g_i\) 为点 \(i\) 为重心的方案数。
那就只需要考虑枚举重心为 \(j \in [i + 1, n]\) 时的方案数减掉即可。
因为点 \(j > i\) 出现在 \(i\) 子树内的概率为 \(\frac{1}{i}\),所以有 \(g_i = f_i - \frac{\sum\limits_{j = i + 1}^n g_j}{i}\)。

时间复杂度 \(O(n\log n)\),容易做到 \(O(n)\)。

#include<bits/stdc++.h>
using i64 = long long;
const i64 mod = 998244353;
inline i64 qpow(i64 a, i64 b) {
    i64 v = 1;
    while (b) b & 1 && ((v *= a) %= mod), (a *= a) %= mod, b >>= 1;
    return v;
}
inline i64 inv(i64 a) {return qpow(a, mod - 2);}
const int maxn = 2e5 + 10, limn = 2e5;
i64 fac[maxn], finv[maxn];
inline i64 C(int n, int m) {return n < m ? 0 : (fac[n] * finv[m] % mod * finv[n - m] % mod);}
i64 f[maxn];
int main() {
    fac[0] = finv[0] = 1;
    for (int i = 1; i <= limn; i++) fac[i] = fac[i - 1] * i % mod;
    finv[limn] = inv(fac[limn]);
    for (int i = limn; i > 1; i--) finv[i - 1] = finv[i] * i % mod;
    int n; scanf("%d", &n);
    int m = (n + 1) >> 1;
    i64 sum = 0;
    for (int i = n; i; i--) {
        i64 tot = fac[n - i] * fac[i - 1] % mod * C(n - m, i - 1);
        f[i] = (tot - sum * inv(i) % mod + mod) % mod;
        (sum += f[i]) %= mod;
    }
    for (int i = 1; i <= n; i++) printf("%lld ", f[i]);
    return 0;
}

标签:frac,Probabilities,sum,times,i64,int,1667E,Centroid,mod
From: https://www.cnblogs.com/lhzawa/p/17987328

相关文章

  • CodeForces 1667E Centroid Probabilities
    洛谷传送门CF传送门首先需要了解重心的三种定义:删掉一个点后剩下子树大小\(\le\frac{n}{2}\)的点\(\sum\limits_{i=1}^n\text{dis}(u,i)\)最小的点最深的\(sz_u\ge\left\lceil\frac{n}{2}\right\rceil\)的点这道题我们使用第三种定义,也就是要统计\(i\)为最......
  • CF708C Centroids
    对于一个不是重心的点\(u\),它必定有一棵子树\(T\)包含所有重心(如果有两个重心则它们必定相邻),显然\(|T|>\lfloor\frac{n}{2}\rfloor\),这阻碍了它成为重心。贪心地想,我们要在\(T\)中找出一棵子树\(S\)使得\(|S|\leq\lfloor\frac{n}{2}\rfloor\)且\(|S|\)尽可能大,然后将......
  • webgl centroid质心插值的一点理解
    质心插值说的是什么2023.10.04再次review这个细节点:https://www.opengl.org/pipeline/article/vol003_6/https://github.com/WebGLSamples/WebGL2Samples/blob/master/samples/glsl_centroid.html#L69基本上把这个问题看明白了;centroid代表质心插值;问题来自于在对普通的vary......
  • Two Centroids
    TwoCentroids先考虑对于一棵树,至少要加多少个点才能有两个重心。以重心为根,设最大儿子的子树大小为\(mx\),那么答案就为\((n-mx)-mx=n-2mx\)。接下来考虑如何在加点时维护最大子树,一个显然的性质,加一个点重心最多偏移一位,如果重心偏移,那么\(mx=\lfloor\frac{n}{2......
  • 【树论,计数】Centroid Probabilities
    生生动动贺题贺一遍!考虑先求出\(f_x\)表示\(x\)子树大小\(\leq\frac{n+1}{2}\)的方案数。最后再容斥掉\(x+1\ton\)的方案即可。\[\sum^{n-x+1}_{j=\frac{n+1}{2}}\binom{n-i}{j-1}(j-1)!(n-j-1)!(i-1)\]即考虑选出子树,生成子树内和子树......
  • CF708C Centroids 换根dp
    CF708CCentroids一道换根DP。我们可以先找出树的一个重心,那么对于其他所有不是重心的点,它不能成为重心时因为它父亲的那一支节点数大于一半,而可以改造成功,则意味着可以在他父亲那一支里,可以找到子树u,使$siz[u]\len/2$&&$siz[fa]-siz[u]\len/2$。简而言之,就是对于每个......
  • AIM Tech Round 3 (Div. 1)-C. Centroids
    原题链接C.CentroidstimelimitpertestmemorylimitpertestinputoutputTree isaconnectedacyclicgraph.Supposeyouaregivenatreeconsistingof n vertices.Thevertexofthistreeiscalled centroid......
  • CodeForces 1827 D Two Centroids
    洛谷传送门CF传送门考虑固定一个重心,设\(k\)为重心最大子树大小,答案为\(n-2k\)。构造方法是往最大的子树塞叶子。树的重心有一个很好的性质,就是加一个叶子,重心最多移动一条边的距离。简单证一下,设重心为\(x\),往儿子\(u\)的子树中加叶子。如果\(sz_u>\left\lfloor......
  • CF708C Centroids(换根dp)
    题意:给定一颗树,你有一次将树改造的机会,改造的意思是删去一条边,再加入一条边,保证改造后还是一棵树。请问有多少点可以通过改造,成为这颗树的重心?(如果以某个点为根,每个子树的大小都不大于\(\dfrac{n}{2}\),则称某个点为重心)思路:是今天遇到的一道有意思的换根dp呃呃。从题意来看......
  • [paper reading]|IC-FPS: Instance-Centroid Faster Point Sampling Module for 3D Po
    摘要:本文说首次实现了大规模点云场景中基于点的模型的实时检测(<30ms);首先指出FPS采样策略进行下采样是耗时的,尤其当点云增加的时候,计算量和推理时间快速增加;本文提出IC-FPS;包含两个模块:localfeaturediffusionbasedbackgroundpointfilter(LFDBF);CentroidInstanceSampl......