Address

  • 洛谷 P5206
  • LOJ #2983

Solution

  • 这是一道计数 (shen) 好 (xian) 题,综合性很强 ,虽然是三合一
  • 鉴于此题用到的算法较多,我就不在标题里列出了,此题用到的算法及技巧如下
  • 容斥原理
  • prufer 序列计数
  • 组合数学
  • 树形 DP
  • 多项式 exp

Task 1 : op=0op=0op=0

  • 首先分析下问题,很容易得出,如果设 T0T_0T0​ 表示一个 nnn 个点的森林,边集为两棵树 T1T_1T1​ 和 T2T_2T2​ 的边交集,且 T0T_0T0​ 包含 cntcntcnt 个连通块,则答案为
  • ycnty^{cnt}ycnt
  • 利用 map 等很多技巧都可以求两棵树的边交集
  • O(nlog⁡n)O(n\log n)O(nlogn)

Task 2 : op=1op=1op=1

前置知识:已经确定一些边的生成树计数

  • 这个问题大致为:有 mmm 个连通块,第 iii 个连通块包含 aia_iai​ 个点, n=∑i=1main=\sum_{i=1}^ma_in=∑i=1m​ai​
  • 求用 m−1m-1m−1 条边连接 mmm 个连通块的方案数
  • 考虑一种对树进行计数的工具 prufer 序列
  • 先考虑,如果对于所有的 iii 都有 ai=1a_i=1ai​=1 ,那么长度为 m−2m-2m−2 的 prufer 序列每个元素都可以取 mmm 个点中的任一个,方案数 mm−2m^{m-2}mm−2
  • 此外, prufer 序列的另一个性质:度数为 ddd 的点在序列中出现 d−1d-1d−1 次
  • 回到 aia_iai​ 不一定等于 111 的情况,设第 iii 的点的度数为 did_idi​
  • 那么第 iii 个连通块会让方案数额外乘上 aidia_i^{d_i}aidi​​
  • 我们可以把过程看成如下
  • 初始时设 res=∏i=1maires=\prod_{i=1}^ma_ires=∏i=1m​ai​
  • 然后考虑 prufer 序列的第 iii 个元素 pip_ipi​
  • 如果 pip_ipi​ 取 uuu ,那么会为方案数乘上 aua_uau​ ,而 pip_ipi​ 可以取 mmm 个连通块中的任一,故将 resresres 乘上 nnn
  • 注意到处理 prufer 的过程中,第 iii 个连通块贡献了 di−1d_i-1di​−1 次 aia_iai​,再乘上初始的 ∏i=1mai\prod_{i=1}^ma_i∏i=1m​ai​ 恰好是贡献 did_idi​ 次
  • 所以方案数为
  • res=nm−2∏i=1maires=n^{m-2}\prod_{i=1}^ma_ires=nm−2i=1∏m​ai​

回到问题

  • 我们知道,对于森林,有:边数 +++ 连通块个数 === 点数
  • 设 C(S)C(S)C(S) 表示树 T2T_2T2​ 有多少种取法使得 T1T_1T1​ 与 T2T_2T2​ 的边交集恰好为 SSS
  • 那么答案显然为
  • ∑SC(S)×yn−∣S∣\sum_SC(S)\times y^{n-|S|}S∑​C(S)×yn−∣S∣
  • 考虑利用容斥化一下 C(S)C(S)C(S)
  • 设 D(S)D(S)D(S) 表示树 T2T_2T2​ 有多少种取法使得边集 SSS 是 T1T_1T1​ 与 T2T_2T2​ 的边交集的子集
  • 那么 D(S)D(S)D(S) 显然比 C(S)C(S)C(S) 容易直接求。这就相当于 T1T_1T1​ 和 T2T_2T2​ 都必须包含边集 SSS
  • 于是 D(S)D(S)D(S) 就相当于有 ∣S∣|S|∣S∣ 条边已经确定的情况下,在剩下的边中选 n−1−∣S∣n-1-|S|n−1−∣S∣ 条,连通所有点的方案数,可以用上面介绍的 prufer 序列计数求得
  • 于是求 C(S)C(S)C(S) 我们可以容斥
  • C(S)=∑S⊂T(−1)∣T∣−∣S∣D(T)C(S)=\sum_{S\subset T}(-1)^{|T|-|S|}D(T)C(S)=S⊂T∑​(−1)∣T∣−∣S∣D(T)
  • 代入答案的式子
  • answer=yn∑S(y−1)∣S∣C(S)answer=y^n\sum_S(y^{-1})^{|S|}C(S)answer=ynS∑​(y−1)∣S∣C(S)
  • =yn∑S(y−1)∣S∣∑S⊂T(−1)∣T∣−∣S∣D(T)=y^n\sum_S(y^{-1})^{|S|}\sum_{S\subset T}(-1)^{|T|-|S|}D(T)=ynS∑​(y−1)∣S∣S⊂T∑​(−1)∣T∣−∣S∣D(T)
  • 把 TTT 集合提到外层枚举
  • =yn∑TD(T)∑S⊂T(y−1)∣S∣(−1)∣T∣−∣S∣=y^n\sum_TD(T)\sum_{S\subset T}(y^{-1})^{|S|}(-1)^{|T|-|S|}=ynT∑​D(T)S⊂T∑​(y−1)∣S∣(−1)∣T∣−∣S∣
  • 发现在枚举 S⊂TS\subset TS⊂T 时, ∣S∣|S|∣S∣ 相同的集合 SSS 本质上没有区别
  • =yn∑TD(T)∑i=0∣T∣(∣T∣i)(y−1)i(−1)∣T∣−i=y^n\sum_TD(T)\sum_{i=0}^{|T|}\binom{|T|}i(y^{-1})^i(-1)^{|T|-i}=ynT∑​D(T)i=0∑∣T∣​(i∣T∣​)(y−1)i(−1)∣T∣−i
  • 由二项式定理得
  • =yn∑TD(T)(y−1−1)∣T∣=y^n\sum_TD(T)(y^{-1}-1)^{|T|}=ynT∑​D(T)(y−1−1)∣T∣
  • 注意这里的 TTT 只能取树 T1T_1T1​ 的边子集
  • 发现当 y=1y=1y=1 时会对我们的处理造成不便,直接特判掉: y=1y=1y=1 时答案为 nn−2n^{n-2}nn−2
  • 然后继续转化上式,设 R(S)R(S)R(S) 表示 nnn 个点,加入树 T1T_1T1​ 中除边集 SSS 之外的所有边之后,每个连通块大小之积,根据上面介绍的 prufer 序列计数,可以得到
  • =yn∑Sn∣S∣−1R(S)(y−1−1)n−(∣S∣+1)=y^n\sum_Sn^{|S|-1}R(S)(y^{-1}-1)^{n-(|S|+1)}=ynS∑​n∣S∣−1R(S)(y−1−1)n−(∣S∣+1)
  • =(y(y−1−1))nn2∑SR(S)(n(y−1−1)−1)∣S∣+1=\frac{(y(y^{-1}-1))^n}{n^2}\sum_SR(S)(n(y^{-1}-1)^{-1})^{|S|+1}=n2(y(y−1−1))n​S∑​R(S)(n(y−1−1)−1)∣S∣+1
  • (y(y−1−1))nn2\frac{(y(y^{-1}-1))^n}{n^2}n2(y(y−1−1))n​ 这一部分可以在算好后面的部分之后再去乘上。我们设 Y=n(y−1−1)−1Y=n(y^{-1}-1)^{-1}Y=n(y−1−1)−1 ,那么 ∑SR(S)Y∣S∣+1\sum_SR(S)Y^{|S|+1}∑S​R(S)Y∣S∣+1 就相当于把树 T1T_1T1​ 分成几个连通块,分成 iii 个连通块的贡献为 YiY^iYi 乘上所有连通块的大小之积
  • 这显然可以用树形 DP 解决
  • 发现由于需要考虑所有连通块的大小之积,所以这个 DP 是 O(n2)O(n^2)O(n2) 的
  • 我们不妨寻找一个 R(S)Y∣S∣+1R(S)Y^{|S|+1}R(S)Y∣S∣+1 的组合意义
  • 这相当于在 ∣S∣+1|S|+1∣S∣+1 个连通块中,每个连通块内各选一点,选一个点会乘上 YYY 的贡献
  • 于是 ∑SR(S)Y∣S∣+1\sum_SR(S)Y^{|S|+1}∑S​R(S)Y∣S∣+1 就相当于选出一些点,若选出了 iii 个点,那么贡献为 YiY^iYi 乘上选出 i−1i-1i−1 条边切掉使得这 iii 个点两两不连通的方案数
  • 于是我们可以开始 DP 了
  • f[u]f[u]f[u] 表示 uuu 的子树内选出一些点,使得这些点归属不同的连通块
  • g[u]g[u]g[u] 表示 uuu 的子树内选出一些点(不能选 uuu ),使得 uuu 归属一个连通块,选出的点各自位于一个连通块
  • 如果 uuu 的子树只有一个点则 f[u]=Yf[u]=Yf[u]=Y , g[u]=1g[u]=1g[u]=1
  • 使用背包合并的方式转移,如果 uuu 处理到子树 vvv 之前的 DP 数组为 f′f'f′ 和 g′g'g′ ,则
  • f[u]=f′[u]×f[v]+g′[u]×f[v]+f′[u]×g[v]f[u]=f'[u]\times f[v]+g'[u]\times f[v]+f'[u]\times g[v]f[u]=f′[u]×f[v]+g′[u]×f[v]+f′[u]×g[v]
  • g[u]=g′[u]×f[v]+g′[u]×g[v]g[u]=g'[u]\times f[v]+g'[u]\times g[v]g[u]=g′[u]×f[v]+g′[u]×g[v]
  • 即转移时分 (u,v)(u,v)(u,v) 切掉与不切掉进行讨论
  • 于是答案为
  • (y(y−1−1))nn2f[Root]\frac{(y(y^{-1}-1))^n}{n^2}f[Root]n2(y(y−1−1))n​f[Root]
  • O(n)O(n)O(n)

Task 3 : op=2op=2op=2

前置知识:指数生成函数与多项式 EXP

  • 定义组合对象 AAA 的指数生成函数 F(x)F(x)F(x) 为
  • F(x)=∑i≥0Aii!F(x)=\sum_{i\ge 0}\frac{A_i}{i!}F(x)=i≥0∑​i!Ai​​
  • 可以得出,如果组合对象 AAA 和 BBB 的指数生成函数分别为 F(x)F(x)F(x) 和 G(x)G(x)G(x) ,那么将这两个组合对象进行带标号拼接得到 CCC ,则 CCC 的指数生成函数 H(x)H(x)H(x) 有
  • [xn]H(x)=Cnn!=∑i+j=n(ni)AiBj(n!)−1[x^n]H(x)=\frac{C_n}{n!}=\sum_{i+j=n}\binom niA_iB_j(n!)^{-1}[xn]H(x)=n!Cn​​=i+j=n∑​(in​)Ai​Bj​(n!)−1
  • =∑i+j=n[xi]F(x)[xj]G(x)=\sum_{i+j=n}[x^i]F(x)[x^j]G(x)=i+j=n∑​[xi]F(x)[xj]G(x)
  • 即 H(x)=F(x)G(x)H(x)=F(x)G(x)H(x)=F(x)G(x)
  • 然后引入多项式 EXP
  • 设组合对象 AAA 的指数生成函数 F(x)F(x)F(x) ( A0=0A_0=0A0​=0 ),有
  • eF(x)=∑i≥0Fi(x)i!e^{F(x)}=\sum_{i\ge 0}\frac{F^i(x)}{i!}eF(x)=i≥0∑​i!Fi(x)​
  • 显然 Fi(x)F^i(x)Fi(x) 表示 iii 个组合对象 AAA 带标号拼接
  • Fi(x)i!\frac{F^i(x)}{i!}i!Fi(x)​ 表示 iii 个组合对象 AAA 不考虑彼此顺序的拼接
  • 于是 eF(x)e^{F(x)}eF(x) 表示一些组合对象 AAA 进行不考虑彼此顺序的拼接
  • 以上概念可能有些含糊,所以我们引入一个例子
  • 如,无向简单图(不含重边和自环)是由若干无向简单连通图构成的
  • 连通块之间没有顺序
  • 所以若无向简单图个数的指数生成函数为 G(x)G(x)G(x) ,无向简单连通图个数的指数生成函数为 F(x)F(x)F(x) ,则
  • G(x)=eF(x)G(x)=e^{F(x)}G(x)=eF(x)
  • 显然 G(x)G(x)G(x) 是个形式幂级数,我们如何求得 G(x) mod xnG(x)\bmod x^nG(x)modxn 呢?
  • 由牛顿迭代得
  • Gk+1(x)=Gk(x)(1−ln⁡Gk(x)+F(x))G_{k+1}(x)=G_k(x)(1-\ln G_k(x)+F(x))Gk+1​(x)=Gk​(x)(1−lnGk​(x)+F(x))
  • 其中 Gk(x)=G(x) mod x2k,G0(x)=1G_k(x)=G(x)\bmod x^{2^k},G_0(x)=1Gk​(x)=G(x)modx2k,G0​(x)=1
  • 将 kkk 从 111 迭代到 ≥n\ge n≥n 为止即可。复杂度 O(nlog⁡n)O(n\log n)O(nlogn)

回到问题

  • 特判掉 y=1y=1y=1 时答案为 n2(n−2)n^{2(n-2)}n2(n−2)
  • 前面的容斥推导基本一样,同样地
  • answer=yn∑TD(T)(y−1−1)∣T∣answer=y^n\sum_TD(T)(y^{-1}-1)^{|T|}answer=ynT∑​D(T)(y−1−1)∣T∣
  • 注意,这时候 D(T)D(T)D(T) 表示钦定边集 TTT 时 nnn 个点生成树个数的平方(因为要确定两棵树),这里的 TTT 可以取任意不成环的边集
  • 易得 D(T)D(T)D(T) 等于 nnn 的 2(n−∣T∣−2)2(n-|T|-2)2(n−∣T∣−2) 次幂,乘上所有连通块大小之积的平方,但如果我们枚举的是连通块分属情况而不是边集 TTT ,我们还需要考虑每个连通块长什么样
  • 我们尝试把枚举 TTT 改成枚举边集 TTT 的连通块分属情况,则
  • answer=(y(y−1−1))nn4∑Ts(n2(y−1−1)−1)∣Ts∣∏i=1∣Ts∣TsiTsianswer=\frac{(y(y^{-1}-1))^n}{n^4}\sum_{Ts}(n^2(y^{-1}-1)^{-1})^{|Ts|}\prod_{i=1}^{|Ts|}Ts_i^{Ts_i}answer=n4(y(y−1−1))n​Ts∑​(n2(y−1−1)−1)∣Ts∣i=1∏∣Ts∣​TsiTsi​​
  • 其中 TsTsTs 为一种连通块划分, ∣Ts∣|Ts|∣Ts∣ 为连通块个数, TsiTs_iTsi​ 为第 iii 个连通块大小, ∏i=1∣Ts∣TsiTsi\prod_{i=1}^{|Ts|}Ts_i^{Ts_i}∏i=1∣Ts∣​TsiTsi​​ 即为对划分方案 TsTsTs 来说,每个连通块的生成树个数之积,再乘上每个连通块大小之积的平方
  • 就 ∑\sum∑ 后面的东西进行考虑,如果只有一个大小为 iii 的连通块,设
  • Y=n2(y−1−1)−1Y=n^2(y^{-1}-1)^{-1}Y=n2(y−1−1)−1
  • f[i]=ii×Yf[i]=i^i\times Yf[i]=ii×Y
  • 设 F(x)F(x)F(x) 为 f[i]f[i]f[i] 的指数生成函数,那么发现 ∑Ts(n2(y−1−1)−1)∣Ts∣∏i=1∣Ts∣TsiTsi\sum_{Ts}(n^2(y^{-1}-1)^{-1})^{|Ts|}\prod_{i=1}^{|Ts|}Ts_i^{Ts_i}∑Ts​(n2(y−1−1)−1)∣Ts∣∏i=1∣Ts∣​TsiTsi​​ 其实就等于 n![xn]eF(x)n![x^n]e^{F(x)}n![xn]eF(x) ,直接套用多项式 exp 的板子即可
  • O(nlog⁡n)O(n\log n)O(nlogn)

Code

#include <bits/stdc++.h>// 20030830inline int read()
{int res = 0; bool bo = 0; char c;while (((c = getchar()) < '0' || c > '9') && c != '-');if (c == '-') bo = 1; else res = c - 48;while ((c = getchar()) >= '0' && c <= '9')res = (res << 3) + (res << 1) + (c - 48);return bo ? ~res + 1 : res;
}template <class T>
inline void Swap(T &a, T &b) {T t = a; a = b; b = t;}const int N = 1e5 + 5, M = N << 1, L = N * 7, ZZQ = 998244353,
INV2 = 499122177, INV4 = 748683265;int n, y, op;int qpow(int a, int b)
{int res = 1;while (b){if (b & 1) res = 1ll * res * a % ZZQ;a = 1ll * a * a % ZZQ;b >>= 1;}return res;
}namespace solve0
{int fa[N], ans;std::map<int, int> app[N];int cx(int x){if (fa[x] != x) fa[x] = cx(fa[x]);return fa[x];}void zm(int x, int y){int ix = cx(x), iy = cx(y);if (ix != iy) fa[iy] = ix;}void work(){int u, v;for (int i = 1; i <= n; i++) fa[i] = i;for (int i = 1; i < n; i++)u = read(), v = read(), app[u][v] = app[v][u] = 1;for (int i = 1; i < n; i++){u = read(); v = read();if (app[u][v]) zm(u, v);}for (int i = 1; i <= n; i++) if (cx(i) == i) ans++;printf("%d\n", qpow(y, ans));}
};namespace solve1
{int ecnt, nxt[M], adj[N], go[M], f[N], g[N];void add_edge(int u, int v){nxt[++ecnt] = adj[u]; adj[u] = ecnt; go[ecnt] = v;nxt[++ecnt] = adj[v]; adj[v] = ecnt; go[ecnt] = u;}void dfs(int u, int fu){f[u] = y; g[u] = 1;for (int e = adj[u], v; e; e = nxt[e]){if ((v = go[e]) == fu) continue;dfs(v, u);int tf = (1ll * f[u] * f[v] + 1ll * g[u] * f[v]+ 1ll * f[u] * g[v]) % ZZQ,tg = (1ll * g[u] * f[v] + 1ll * g[u] * g[v]) % ZZQ;f[u] = tf; g[u] = tg;}}void work(){int u, v;for (int i = 1; i < n; i++)u = read(), v = read(), add_edge(u, v);if (y == 1) return (void) printf("%d\n", qpow(n, n - 2));int st = 1ll * y * (qpow(y, ZZQ - 2) - 1) % ZZQ;y = 1ll * qpow(qpow(y, ZZQ - 2) - 1, ZZQ - 2) * n % ZZQ;dfs(1, 0);printf("%d\n", 1ll * qpow(st, n) * f[1] % ZZQ* qpow(1ll * n * n % ZZQ, ZZQ - 2) % ZZQ);}
};namespace solve2
{int fac[L], inv[L], invf[L], f[L], yp[L], rev[L], ta[L], tb[L],tmpf[L], tmpg[L], da[L], inva[L], tf[L], tg[L], tln[L], ans[L];void FFT(int n, int *a, int op){for (int i = 0; i < n; i++) if (i < rev[i]) Swap(a[i], a[rev[i]]);yp[n] = qpow(3, (ZZQ - 1) / n * ((n + op) % n));for (int i = n >> 1; i; i >>= 1)yp[i] = 1ll * yp[i << 1] * yp[i << 1] % ZZQ;for (int k = 1; k < n; k <<= 1){int x = yp[k << 1];for (int i = 0; i < n; i += k << 1){int w = 1;for (int j = 0; j < k; j++){int u = a[i + j], v = 1ll * w * a[i + j + k] % ZZQ;a[i + j] = (u + v) % ZZQ;a[i + j + k] = (u - v + ZZQ) % ZZQ;w = 1ll * w * x % ZZQ;}}}}void polymul(int n, int *a, int *b, int *res){int ff = 1, tot = 0;while (ff < (n << 1) - 1) ff <<= 1, tot++;for (int i = 0; i < ff; i++)rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << tot - 1);for (int i = 0; i < ff; i++){ta[i] = i < n ? a[i] : 0;tb[i] = i < n ? b[i] : 0;}FFT(ff, ta, 1); FFT(ff, tb, 1);for (int i = 0; i < ff; i++) ta[i] = 1ll * ta[i] * tb[i] % ZZQ;FFT(ff, ta, -1);int gg = qpow(ff, ZZQ - 2);for (int i = 0; i < ff; i++) res[i] = 1ll * ta[i] * gg % ZZQ;}void polyinv(int n, int *a, int *res){res[0] = qpow(a[0], ZZQ - 2);int ff = 4, tot = 2, gg = INV4;for (int k = 1; k < n; k <<= 1){for (int i = 0; i < ff; i++)rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << tot - 1);for (int i = 0; i < ff; i++){tmpf[i] = i < n && i < (k << 1) ? a[i] : 0;tmpg[i] = i < k ? res[i] : 0;}FFT(ff, tmpf, 1); FFT(ff, tmpg, 1);for (int i = 0; i < ff; i++)tmpf[i] = 1ll * tmpg[i] * (ZZQ + 2 -1ll * tmpf[i] * tmpg[i] % ZZQ) % ZZQ;FFT(ff, tmpf, -1);for (int i = 0; i < (k << 1); i++)res[i] = 1ll * tmpf[i] * gg % ZZQ;ff <<= 1; tot++;gg = 1ll * gg * INV2 % ZZQ;}}void polyln(int n, int *a, int *res){for (int i = 0; i < n; i++)da[(i + n - 1) % n] = 1ll * i * a[i] % ZZQ;polyinv(n, a, inva);polymul(n, da, inva, res);for (int i = n - 2; i >= 0; i--)res[i + 1] = 1ll * inv[i + 1] * res[i] % ZZQ;res[0] = 0;}void polyexp(int n, int *a, int *res){res[0] = 1;int ff = 4, tot = 2, gg = INV4;for (int k = 1; k < n; k <<= 1){for (int i = 0; i < ff; i++)tg[i] = i < k ? res[i] : 0;polyln(ff, tg, tln);for (int i = 0; i < ff; i++)tf[i] = i < n && i < (k << 1) ? a[i] : 0;for (int i = 0; i < ff; i++)rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << tot - 1);for (int i = (k << 1); i < ff; i++) tln[i] = 0;FFT(ff, tg, 1); FFT(ff, tf, 1); FFT(ff, tln, 1);for (int i = 0; i < ff; i++)tf[i] = (1ll - tln[i] + tf[i] + ZZQ) * tg[i] % ZZQ;FFT(ff, tf, -1);for (int i = 0; i < (k << 1); i++)res[i] = 1ll * tf[i] * gg % ZZQ;ff <<= 1; tot++;gg = 1ll * gg * INV2 % ZZQ;}}void work(){if (y == 1) return (void) printf("%d\n", qpow(n, n - 2 << 1));int st = 1ll * y * (qpow(y, ZZQ - 2) - 1) % ZZQ;y = 1ll * qpow(qpow(y, ZZQ - 2) - 1, ZZQ - 2) * n % ZZQ * n % ZZQ;fac[0] = inv[1] = invf[0] = 1;for (int i = 1; i < L; i++)fac[i] = 1ll * fac[i - 1] * i % ZZQ;for (int i = 2; i < L; i++)inv[i] = 1ll * (ZZQ - ZZQ / i) * inv[ZZQ % i] % ZZQ;for (int i = 1; i < L; i++)invf[i] = 1ll * invf[i - 1] * inv[i] % ZZQ;for (int i = 1; i <= n; i++)f[i] = 1ll * qpow(i, i) * y % ZZQ * invf[i] % ZZQ;polyexp(n + 1, f, ans);printf("%d\n", 1ll * qpow(st, n) * ans[n] % ZZQ * fac[n] % ZZQ* qpow(n, ZZQ - 5) % ZZQ);}
};int main()
{n = read(); y = read(); op = read();if (op == 0) solve0::work();else if (op == 1) solve1::work();else solve2::work();return 0;
}

[LOJ#2983][WC2019]数树相关推荐

  1. 洛谷P5206/loj2983 [WC2019]数树

    今年年初,WC2019上,我继续扮演爆零士,Q1Q2双爆零,弘扬爆零文化,希望大家多多资磁. y=1的subtask输出1的就是在下 这位大佬写的题解真是精妙啊->here Question0 ...

  2. 并不对劲的bzoj5475:loj2983:p5206:[wc2019]数树

    题目大意 task0:有两棵\(n\)(n\leq10^5)个点的树\(T1,T2\),每个点的点权可以是一个在\([1,y]\)里的数,如果两个点既在\(T1\)中有直接连边,又在\(T2\)中有直 ...

  3. BZOJ5475 WC2019数树(prufer+容斥原理+树形dp+多项式exp)

    因为一大堆式子实在懒得写题解了.首先用prufer推出CF917D用到的结论,然后具体见前言不搭后语的注释. #include<iostream> #include<cstdio&g ...

  4. Loj #2983. 「WC2019」数树

    Loj #2983. 「WC2019」数树 题目背景 白兔喜欢树. 白云喜欢数数. 有 \(n\) 只鼠,白兔用 \(n − 1\) 根蓝色绳子把它们连成了一棵树,每根蓝色绳子连着两只鼠,白云用 \( ...

  5. 【LOJ】#2983. 「WC2019」数树

    LOJ2983. 「WC2019」数树 task0 有\(i\)条边一样答案就是\(y^{n - i}\) task1 这里有个避免容斥的方法,如果有\(i\)条边重复我们要算的是\(y^{n - i ...

  6. [NowCoder牛客]2021NOIP提高组模拟赛第二场T3——树数树(启发式合并堆)

    树数树 description solution code description [题目描述] 牛牛有一棵 n 个点的有根树,根为 1. 我们称一个长度为 m 的序列 a 是好的,当且仅当: • ∀

  7. 中望CAD的引线标注格式怎么改_手把手教你CAD园林设计 再也不用数树了

    之前听粉丝朋友说过有些关于园林设计的趣事,说他朋友有时候的工作是对着电脑数树. 事实上,园林设计中很多地方都涉及到绿植,而且数量不少,虽然日常数树调侃居多,但是对于设计师来说,如何快速处理好这部分,是 ...

  8. 【WC2019】数树【子集反演】【结论】【树形dp】【生成函数】【函数求导】【多项式全家桶】

    题意:有两棵基于同一点集的树,点集大小为 nnn ,两棵树中有 opopop 棵未确定,可以取所有 nn−2n^{n-2}nn−2 种可能.给每个点染上 [1,y][1,y][1,y] 中的一个颜色, ...

  9. 【LOJ2983】「WC2019」数树

    [题目链接] 点击打开链接 [思路要点] op=0op=0op=0 ,算一算两棵树的公共边数即可. 时间复杂度 O(N)O(N)O(N) 或 O(NLogN)O(NLogN)O(NLogN) . op ...

最新文章

  1. spring cloud gateway之服务注册与发现
  2. 聚合Aggregation与合成Composition
  3. matlab播放视频语句,matlab语句
  4. 以下输出结果为16的python_作业 -- 几道简单的Python题
  5. 利用推送测试工具,测试推送是否写好
  6. 2_1_6 递归与分治策略(汉诺塔问题)
  7. ADO的几种数据库连接方式
  8. 掌握了这个方法,以后遇到bug不用再求人了!
  9. ORM for Net主流框架汇总与效率测试
  10. 容器编排技术 -- Kubernetes kubectl create rolebinding 命令详解
  11. 读取properties文件的信息
  12. HTTP请求消息头和HTTP响应消息头
  13. sqlu8多阶级层次bom_心理学:有这二种“长相”的男人,往往层次很高,女人可多留意...
  14. 纯新手DSP编程--5.29--DSP/BIOS任务管理和后台线程
  15. 一种使用16QAM的OFDM系统MATLAB仿真
  16. jQuery treeTable
  17. c++ 开根号程序 算法实现 C++函数同时返回两个值
  18. java 切面 不执行,Spring AOP 切面没有执行
  19. 主播入门到精通培训实操手册全套资料(共300份)
  20. Rails PayPal 支付对接

热门文章

  1. 接口里面的方法都是抽象方法吗_手机赚钱靠谱的方法 这些你都知道吗?
  2. k3note Android8,增强用户体验 八款高品质音乐手机推荐
  3. 科技改变生活,老年人的福音:自动驾驶汽车
  4. Hi3559AV100如何调试NVP6324 寄存器
  5. 世界前 1000 顶级计算机科学家名单出炉;Java25岁生日官方启动最佳JDK功能票选活动...
  6. 联动优势 java_联动优势APP支付
  7. 淘宝新规:对于好评返现变化的应对决策你了解多少?
  8. 校园水电能源监测管理系统
  9. 炫界 (302) -(查动简)_原302张鸿飞主任退休了吗?菊梅医生:乙肝妈妈的母乳喂养...
  10. 国外除了TikTok还有哪些短视频app