一道技巧性非常强的计数题,历年WC出得最好(同时可能是比较简单)的题目之一。

题目传送门:洛谷P5206

题意简述:

给定 \(n, y\)。

一张图有 \(|V| = n\) 个点。对于两棵树 \(T_1=G(V, E_1)\) 和 \(T_2=G(V, E_2)\),定义这两棵树的权值 \(F(E_1, E_2)\) 为 \(y\) 的 \(G'=(V,E_1\cap E_2)\) 的连通块个数次方。

即 \(F(E_1, E_2) = y^{n - |E_1\cap E_2|}\)(因为两棵树的边集的交必然是一个森林,而森林的连通块个数等于 \(|V| - |E|\))。

有 \(3\) 类问题:

  1. \(\mathrm{op}=0\),给定 \(E_1, E_2\),计算 \(F(E_1, E_2)\)。
  2. \(\mathrm{op}=1\),给定 \(E_1\),计算 \(\displaystyle \sum_{E_2} F(E_1, E_2)\)。
  3. \(\mathrm{op}=2\),计算 \(\displaystyle \sum_{E_1} \sum_{E_2} F(E_1, E_2)\)。

其中 \(\displaystyle \sum_{E}\) 的意义为枚举所有 \(n^{n - 2}\) 种不同形态的有标号无根树。

其中 \(n\le 10^5\)。答案对 \(998,244,353\) 取模。

题解:

在这里特别感谢 @rqy 的题解 [WC2019] 数树

我对此题的理解以及代码实现的细节很大程度上借鉴了他的题解。

对于 \(y = 1\):

\(y = 1\) 时在后续讨论中有一些无意义的地方,这里先判掉。

\(y = 1\) 时 \(F(E_1, E_2) = 1\)。

\(\mathrm{op}=0\) 时,只有 \(1\) 种方案,则答案为 \(1\)。

\(\mathrm{op}=1\) 时,有 \(n^{n-2}\) 种方案,则答案为 \(n^{n-2}\)。

\(\mathrm{op}=2\) 时,有 \(n^{2(n-2)}\) 种方案,则答案为 \(n^{2(n-2)}\)。

  1. namespace Solver0 {
  2. inline LL solve() {
  3. if (op == 0) return 1;
  4. if (op == 1) return qPow(N, N - 2);
  5. if (op == 2) return qPow(N, 2 * (N - 2));
  6. return 0;
  7. }
  8. }

对于 \(\mathrm{op} = 0\):

直接统计出有多少条边重合,随便用一个 std::set<std::pair<int,int> > 统计一下。

  1. namespace Solver1 {
  2. typedef std::pair<int, int> pii;
  3. std::set<pii> S;
  4. inline LL solve() {
  5. for (int i = 1, x, y; i < N; ++i) {
  6. scanf("%d%d", &x, &y);
  7. if (x > y) std::swap(x, y);
  8. S.insert(std::make_pair(x, y));
  9. }
  10. int cnt = N;
  11. for (int i = 1, x, y; i < N; ++i) {
  12. scanf("%d%d", &x, &y);
  13. if (x > y) std::swap(x, y);
  14. cnt -= S.count(std::make_pair(x, y));
  15. }
  16. return qPow(Y, cnt);
  17. }
  18. }

对于 \(y\ne 1\) 且 \(\mathrm{op} = 1\):

给定 \(E_1\),对于每一种 \(E_2\),统计 \(y^{n-|E_1\cap E_2|}\)。

考虑枚举 \(S=E_1\cap E_2\),则答案为:

\[\begin{aligned}&\sum_{E_2}F(E_1,E_2)\\=&\sum_{E_2}y^{n-|E_1\cap E_2|}\\=&\sum_{S}y^{n-|S|}\sum_{S=E_1\cap E_2}\end{aligned}
\]

后面这个不是很优美,我们容斥一下,希望变成 \(S\subseteq E_1\cap E_2\),即 \(S\subseteq E_1\) 且 \(S\subseteq E_2\) 的形式:

考虑一个容斥原理的式子:\(\displaystyle f(S)=\sum_{T\subseteq S}\sum_{P\subseteq T}(-1)^{|T|-|P|}f(P)\)。

令 \(S=E_1\cap E_2\),\(f(S)=y^{n-|S|}\),带进去一下,得到:

\[\begin{aligned}&\sum_{E_2}y^{n-|E_1\cap E_2|}\\=&\sum_{E_2}\sum_{T\subseteq E_1\cap E_2}\sum_{P\subseteq T}(-1)^{|T|-|P|}y^{n-|P|}\\=&\sum_{T\subseteq E_1}g(T)\sum_{P\subseteq T}(-1)^{|T|-|P|}y^{n-|P|}\\=&\sum_{T\subseteq E_1}g(T)y^{n-|T|}\sum_{P\subseteq T}(-y)^{|T|-|P|}\\=&\sum_{T\subseteq E_1}g(T)y^{n-|T|}\sum_{k=0}^{|T|}\binom{|T|}{k}1^{k}(-y)^{|T|-k}\\=&\sum_{T\subseteq E_1}g(T)y^{n-|T|}(1-y)^{|T|}\end{aligned}
\]

其中 \(g(T)\) 表示包含边集 \(T\) 的树个数。

这里有一个定理,可以用 \(\mathrm{Pr\ddot{u}fer}\) 序列证明,也可以用 \(\mathrm{Matrix-Tree}\) 定理证明:

  • 对于 \(n\) 个点的森林,假设有 \(k\) 个连通分量,每个连通分量的大小分别是 \(a_i\),则包含这个森林的树个数为 \(\displaystyle n^{k-2}\prod_{i=1}^{k}a_i\)。

再带入可得:

\[\begin{aligned} &\sum_{T\subseteq E_1}g(T)y^{n-|T|}(1-y)^{|T|}\\=&\sum_{T\subseteq E_1}y^{k}(1-y)^{n-k}n^{k-2}\prod_{i=1}^{k}a_i\\=&\frac{(1-y)^n}{n^2}\sum_{T\subseteq E_1}\prod_{i=1}^{k}\frac{ny}{1-y}a_i\end{aligned}
\]

即一个大小为 \(a\) 的连通分量为答案贡献一个乘积 \(Ka\),其中 \(\displaystyle K = \frac{ny}{1-y}\)。

据此我们可以写出一个 \(\mathrm{DP}\) 式子,用 \(\mathrm{f}[u][i]\) 表示 \(u\) 的子树中,\(u\) 所在的连通分量大小为 \(i\) 的答案。

\(i\) 所在的连通分量还未完整,所以不计入答案,而是存入状态,转类似于树上背包,转移比较显然,这种做法是 \(\mathrm{O}(n^2)\) 的。

我们可以考虑每个贡献的组合意义,大小为 \(a_i\) 的连通分量贡献相当于在这个连通分量中选取一个点产生 \(K\) 的乘积贡献。

据此我们可以优化状态表示:\(\mathrm{f}[u][0/1]\) 表示 \(u\) 的子树中,当前连通分量是否已经做出贡献,这里为了方便转移,当前连通分量如果已经做出贡献就计入答案。

具体转移可以参考下面的代码。

  1. namespace Solver2 {
  2. int h[MN], nxt[MN * 2], to[MN * 2], tot;
  3. inline void ins(int x, int y) {
  4. nxt[++tot] = h[x], to[tot] = y, h[x] = tot;
  5. }
  6. LL K, f[MN], g[MN];
  7. void DFS(int u, int fz) {
  8. f[u] = 1, g[u] = K;
  9. for (int i = h[u]; i; i = nxt[i]) if (to[i] != fz) {
  10. DFS(to[i], u);
  11. g[u] = (f[u] * g[to[i]] + g[u] * f[to[i]] + g[u] * g[to[i]]) % Mod;
  12. f[u] = (f[u] * f[to[i]] + f[u] * g[to[i]]) % Mod;
  13. }
  14. }
  15. inline LL solve() {
  16. for (int i = 1, x, y; i < N; ++i) {
  17. scanf("%d%d", &x, &y);
  18. ins(x, y), ins(y, x);
  19. }
  20. K = (LL)N * Y % Mod * qPow(1 - Y, Mod - 2) % Mod;
  21. LL coef = qPow(1 - Y, N) * qPow(N, Mod - 3) % Mod;
  22. DFS(1, 0);
  23. return g[1] * coef % Mod;
  24. }
  25. }

对于 \(y\ne 1\) 且 \(\mathrm{op} = 2\):

类似 \(\mathrm{op} = 1\),我们可以写出下面的式子:

\[\begin{aligned}&\sum_{E_1}\sum_{E_2}F(E_1,E_2)\\=&\sum_{E_1}\sum_{E_2}y^{n-|E_1\cap E_2|}\\=&\sum_{E_1}\sum_{E_2}\sum_{T\subseteq E_1\cap E_2}\sum_{P\subseteq T}(-1)^{|T|-|P|}y^{n-|P|}\\=&\sum_{T}g^2(T)\sum_{P\subseteq T}(-1)^{|T|-|P|}y^{n-|P|}\\=&\sum_{T}g^2(T)y^{n-|T|}\sum_{P\subseteq T}(-1)^{|T|-|P|}y^{|T|-|P|}\\=&\sum_{T}g^2(T)y^{n-|T|}\sum_{P\subseteq T}(-y)^{|T|-|P|}\\=&\sum_{T}g^2(T)y^{n-|T|}\sum_{k=0}^{|T|}\binom{|T|}{k}1^{k}(-y)^{|T|-k}\\=&\sum_{T}g^2(T)y^{n-|T|}(1-y)^{|T|}\\=&\sum_{T}y^{k}(1-y)^{n-k}n^{2(k-2)}\prod_{i=1}^{k}a_i^2\\=&\frac{(1-y)^n}{n^4}\sum_{T}\prod_{i=1}^{k}\frac{n^2y}{1-y}a_i^2\end{aligned}
\]

此时我们换个角度考虑,与其考虑边集 \(T\),不如考虑每个连通分量。

这里的每个连通分量是无序的,所以相当于 \(n\) 个有标号小球扔进 \(k\) 个无标号盒子,不允许空盒子。

而一个装有 \(a\) 个球的盒子,每个生成树都会贡献 \(\displaystyle\frac{n^2y}{1-y}a^2\) 作为乘积。

而 \(a\) 个点的生成树有 \(a^{a-2}\) 个,所以总共贡献 \(\displaystyle\frac{n^2y}{1-y}a^a\)。

对生成函数比较敏感的同学能够看出,总方案的指数型生成函数就是单个盒子的指数型生成函数的 \(\mathrm{Exp}\),因为对应了集合与元素的关系。

即 \(\displaystyle\mathrm{f}=\left\{\frac{n^2y}{1-y}i^i\right\}_{i=1}^{\infty}\) 对应的指数型生成函数 \(\displaystyle\mathrm{F}(x)=\sum_{i=1}^{\infty}\frac{n^2y}{(1-y)i!}i^{i}x^{i}\)。

令 \(\mathrm{G}=e^{\mathrm{F}}\),则指数型生成函数 \(\mathrm{G}\) 对应的序列的第 \(n\) 项便是所求答案,即答案为 \(n!\cdot [x^n]\mathrm{G}\)。

如果你对生成函数比较不敏感,也可以推式子得到:

对于有标号球有标号盒子记录贡献,可以使用指数型生成函数的幂次表示:

\(n\) 个有标号球,\(k\) 个有标号盒子就是 \([x^n]\mathrm{F}^k\),但是这里盒子是无标号的,所以要除以 \(k!\)。

那么最终的答案是 \(\displaystyle\frac{(1-y)^n\cdot n!}{n^4}[x^n]\sum_{k=1}^{n}\frac{1}{k!}\left(\sum_{i=1}^{\infty}\frac{n^2y}{(1-y)\cdot i!}i^ix^i\right)^k\)。

根据 \(e^x\) 的泰勒展开公式,可以发现形式是完全相同的。

那么直接套多项式 \(\mathrm{Exp}\) 模板即可。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <set>
  5. typedef long long LL;
  6. const int MN = 100005;
  7. const LL Mod = 998244353;
  8. inline LL qPow(LL b, int e) {
  9. LL a = 1;
  10. for (; e; b = b * b % Mod, e >>= 1)
  11. if (e & 1) a = a * b % Mod;
  12. return a;
  13. }
  14. int N, op;
  15. LL Y;
  16. namespace Solver0 {
  17. inline LL solve() {
  18. if (op == 0) return 1;
  19. if (op == 1) return qPow(N, N - 2);
  20. if (op == 2) return qPow(N, 2 * (N - 2));
  21. return 0;
  22. }
  23. }
  24. namespace Solver1 {
  25. typedef std::pair<int, int> pii;
  26. std::set<pii> S;
  27. inline LL solve() {
  28. for (int i = 1, x, y; i < N; ++i) {
  29. scanf("%d%d", &x, &y);
  30. if (x > y) std::swap(x, y);
  31. S.insert(std::make_pair(x, y));
  32. }
  33. int cnt = N;
  34. for (int i = 1, x, y; i < N; ++i) {
  35. scanf("%d%d", &x, &y);
  36. if (x > y) std::swap(x, y);
  37. cnt -= S.count(std::make_pair(x, y));
  38. }
  39. return qPow(Y, cnt);
  40. }
  41. }
  42. namespace Solver2 {
  43. int h[MN], nxt[MN * 2], to[MN * 2], tot;
  44. inline void ins(int x, int y) {
  45. nxt[++tot] = h[x], to[tot] = y, h[x] = tot;
  46. }
  47. LL K, f[MN], g[MN];
  48. void DFS(int u, int fz) {
  49. f[u] = 1, g[u] = K;
  50. for (int i = h[u]; i; i = nxt[i]) if (to[i] != fz) {
  51. DFS(to[i], u);
  52. g[u] = (f[u] * g[to[i]] + g[u] * f[to[i]] + g[u] * g[to[i]]) % Mod;
  53. f[u] = (f[u] * f[to[i]] + f[u] * g[to[i]]) % Mod;
  54. }
  55. }
  56. inline LL solve() {
  57. for (int i = 1, x, y; i < N; ++i) {
  58. scanf("%d%d", &x, &y);
  59. ins(x, y), ins(y, x);
  60. }
  61. K = (LL)N * Y % Mod * qPow(1 - Y, Mod - 2) % Mod;
  62. LL coef = qPow(1 - Y, N) * qPow(N, Mod - 3) % Mod;
  63. DFS(1, 0);
  64. return g[1] * coef % Mod;
  65. }
  66. }
  67. namespace Solver3 {
  68. const int MS = 1 << 19;
  69. const int G = 3, iG = 332748118;
  70. int Sz = 0, R[MS]; LL InvSz;
  71. LL Inv[MS], Fac[MS], iFac[MS];
  72. inline void Init() {
  73. Inv[1] = 1;
  74. for (int i = 2; i < MS; ++i) Inv[i] = -(Mod / i) * Inv[Mod % i] % Mod;
  75. Fac[0] = iFac[0] = 1;
  76. for (int i = 1; i < MS; ++i) {
  77. Fac[i] = Fac[i - 1] * i % Mod;
  78. iFac[i] = iFac[i - 1] * Inv[i] % Mod;
  79. }
  80. }
  81. inline void InitFNTT(int n) {
  82. int Bt = 0;
  83. for (; 1 << Bt < n; ++Bt) ;
  84. if ((1 << Bt) == Sz) return ;
  85. Sz = 1 << Bt, InvSz = -(Mod - 1) / Sz;
  86. for (int i = 1; i < Sz; ++i) R[i] = R[i >> 1] >> 1 | (i & 1) << (Bt - 1);
  87. }
  88. inline void FNTT(LL *A, int Type) {
  89. for (int i = 0; i < Sz; ++i) if (R[i] < i) std::swap(A[R[i]], A[i]);
  90. for (int j = 1, j2 = 2; j < Sz; j <<= 1, j2 <<= 1) {
  91. LL gn = qPow(~Type ? G : iG, (Mod - 1) / j2), g;
  92. for (int i = 0, k; i < Sz; i += j2) {
  93. for (k = 0, g = 1; k < j; ++k, g = g * gn % Mod) {
  94. LL X = A[i + k], Y = g * A[i + j + k] % Mod;
  95. A[i + k] = (X + Y) % Mod, A[i + j + k] = (X - Y) % Mod;
  96. }
  97. }
  98. }
  99. if (Type == -1) for (int i = 0; i < Sz; ++i) A[i] = A[i] * InvSz % Mod;
  100. }
  101. inline void PolyInv(LL *A, int N, LL *B) {
  102. B[0] = qPow(A[0], Mod - 2);
  103. static LL tA[MS], tB[MS];
  104. for (int L = 1; L < N; L <<= 1) {
  105. int L2 = L << 1, L4 = L << 2;
  106. InitFNTT(L4);
  107. for (int i = 0; i < L2; ++i) tA[i] = A[i];
  108. for (int i = L2; i < Sz; ++i) tA[i] = 0;
  109. for (int i = 0; i < L; ++i) tB[i] = B[i];
  110. for (int i = L; i < Sz; ++i) tB[i] = 0;
  111. FNTT(tA, 1), FNTT(tB, 1);
  112. for (int i = 0; i < Sz; ++i) tB[i] = (2 - tA[i] * tB[i]) % Mod * tB[i] % Mod;
  113. FNTT(tB, -1);
  114. for (int i = 0; i < L2; ++i) B[i] = tB[i];
  115. }
  116. }
  117. inline void PolyLn(LL *A, int N, LL *B) {
  118. static LL tA[MS], tB[MS];
  119. PolyInv(A, N, tB);
  120. InitFNTT(N * 2);
  121. for (int i = 1; i < N; ++i) tA[i - 1] = A[i] * i % Mod;
  122. for (int i = N - 1; i < Sz; ++i) tA[i] = 0;
  123. for (int i = N; i < Sz; ++i) tB[i] = 0;
  124. FNTT(tA, 1), FNTT(tB, 1);
  125. for (int i = 0; i < Sz; ++i) tA[i] = tA[i] * tB[i] % Mod;
  126. FNTT(tA, -1);
  127. B[0] = 0;
  128. for (int i = 1; i < N; ++i) B[i] = tA[i - 1] * Inv[i] % Mod;
  129. }
  130. inline void PolyExp(LL *A, int N, LL *B) {
  131. B[0] = 1;
  132. static LL tA[MS], tB[MS];
  133. for (int L = 1; L < N; L <<= 1) {
  134. int L2 = L << 1, L4 = L << 2;
  135. PolyLn(B, L2, tA);
  136. InitFNTT(L4);
  137. for (int i = 0; i < L2; ++i) tA[i] = (!i + A[i] - tA[i]) % Mod;
  138. for (int i = L2; i < Sz; ++i) tA[i] = 0;
  139. for (int i = 0; i < L2; ++i) tB[i] = B[i];
  140. for (int i = L2; i < Sz; ++i) tB[i] = 0;
  141. FNTT(tA, 1), FNTT(tB, 1);
  142. for (int i = 0; i < Sz; ++i) tA[i] = tA[i] * tB[i] % Mod;
  143. FNTT(tA, -1);
  144. for (int i = 0; i < L2; ++i) B[i] = tA[i];
  145. }
  146. }
  147. inline LL solve() {
  148. Init();
  149. LL K = (LL)N * N % Mod * Y % Mod * qPow(1 - Y, Mod - 2) % Mod;
  150. LL coef = qPow(1 - Y, N) * qPow(N, Mod - 5) % Mod;
  151. static LL A[MS], B[MS];
  152. A[0] = 0;
  153. for (int i = 1; i <= N; ++i) A[i] = K * qPow(i, i) % Mod * iFac[i] % Mod;
  154. PolyExp(A, N + 1, B);
  155. return coef * (B[N] * Fac[N] % Mod) % Mod;
  156. }
  157. }
  158. int main() {
  159. scanf("%d%lld%d", &N, &Y, &op);
  160. if (Y == 1) printf("%lld\n", Solver0::solve());
  161. else if (op == 0) printf("%lld\n", (Solver1::solve() + Mod) % Mod);
  162. else if (op == 1) printf("%lld\n", (Solver2::solve() + Mod) % Mod);
  163. else if (op == 2) printf("%lld\n", (Solver3::solve() + Mod) % Mod);
  164. return 0;
  165. }

洛谷 P5206: bzoj 5475: LOJ 2983: [WC2019] 数树的更多相关文章

  1. 洛谷 P3320: bzoj 3991: LOJ 2182: [SDOI2015]寻宝游戏

    题目传送门:LOJ #2182. 题意简述: 一棵 \(n\) 个节点的树,边有边权. 每个点可能是关键点,每次操作改变一个点是否是关键点. 求所有关键点形成的极小联通子树的边权和的两倍. 题解: 有 ...

  2. 【洛谷5439】【XR-2】永恒(树链剖分,线段树)

    [洛谷5439][XR-2]永恒(树链剖分,线段树) 题面 洛谷 题解 首先两个点的\(LCP\)就是\(Trie\)树上的\(LCA\)的深度. 考虑一对点的贡献,如果这两个点不具有祖先关系,那么这 ...

  3. [WC2019] 数树

    [WC2019] 数树 Zhang_RQ题解(本篇仅概述) 前言 有进步,只做了半天.... 一道具有极强综合性的数数好题! 强大的多合一题目 精确地数学推导和耐心. 有套路又不失心意. 融合了: 算 ...

  4. 洛谷 P5206 - [WC2019]数树(集合反演+NTT)

    洛谷题面传送门 神仙多项式+组合数学题,不过还是被我自己想出来了( 首先对于两棵树 \(E_1,E_2\) 而言,为它们填上 \(1\sim y\) 使其合法的方案数显然是 \(y\) 的 \(E_1 ...

  5. 洛谷 P3307: bzoj 3202: [SDOI2013] 项链

    题目传送门:洛谷P3307.这题在bzoj上是权限题. 题意简述: 这题分为两个部分: ① 有一些珠子,每个珠子可以看成一个无序三元组.三元组要满足三个数都在$1$到$m$之间,并且三个数互质,两个珠 ...

  6. 洛谷 4106 / bzoj 3614 [HEOI2014]逻辑翻译——思路+类似FWT

    题目:https://www.luogu.org/problemnew/show/P4106 https://www.lydsy.com/JudgeOnline/problem.php?id=3614 ...

  7. 洛谷 P3332 BZOJ 3110 [ZJOI2013]K大数查询

    题目链接 洛谷 bzoj 题解 整体二分 Code #include<bits/stdc++.h> #define LL long long #define RG register usi ...

  8. 洛谷 P2486 BZOJ 2243 [SDOI2011]染色

    题目描述 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221” ...

  9. 洛谷 P2827 BZOJ 4721 UOJ #264 蚯蚓

    题目描述 本题中,我们将用符号表示对c向下取整,例如:. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现在共有n只蚯蚓(n为正整数).每只 ...

随机推荐

  1. 【Alpha】功能规格说明书

    更新说明:从用户需求分析中剥离有关用户场景分析部分,加入功能规格说明书. Github地址:https://github.com/buaase/Phylab-Web/blob/master/docs/ ...

  2. 1.AKATSUKI

    ## 1.AKATSUKI - “晓”,日本漫画<火影忍者>及其衍生作品中的一个秘密组织. - 成立之初是为了给自己的国家带来和平. ## 2.团队成员 - 邱东宝 - 211606325 ...

  3. 安装visual studio过程

    昨天上了一天课 ,晚上回到寝室就开始装visual studio这个软件,由于室友有安装包,免去了下载软件的时间,下面是装载软件的步骤: 点击安装,就可以了,安装完显示文件包失败,还以为是哪里弄错了, ...

  4. ElasticSearch 2 (26) - 语言处理系列之打字或拼写错误

    ElasticSearch 2 (26) - 语言处理系列之打字或拼写错误 摘要 我们喜欢在对结构化数据(如:日期和价格)做查询时,结果只返回那些能精确匹配的文档.但是,好的全文搜索不应该有这样的限制 ...

  5. C语言入门:03.关键字、标识符、注释

    一.学习语法之前的提醒 (1)C语言属于一门高级语言,其实,所有高级语言的基本语法组成部分都是一样的,只是表现形式不太一样 (2)就好像亚洲人和非洲人,大家都有人类的结构:2只 手.2只脚.1个头,只 ...

  6. 写出完整版的strcpy函数及其他如:strcat,strcmp,strstr的函数实现

    (---牛客网中刷题---)写出完整版的strcpy函数 如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案: 2分 1 2 3 4 void strcpy( char *st ...

  7. KM算法 PK 最小费用最大流

    用到了KM算法 ,发现自己没有这个模板,搜索学习一下上海大学final大神,http://www.cnblogs.com/kuangbin/p/3228861.html #include <st ...

  8. 【大数据】SparkCore学习笔记

    第1章 RDD概述 1.1 什么是RDD RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象.代码中是一个抽象类,它代表一个不可变.可 ...

  9. 【bzoj2194】快速傅立叶之二 FFT

    题意:给定序列a,b,求序列c,\(c(k)=\sum_{i=k}^{n-1}a(i)b(i-k)\) Solution: \[ c(k)=\sum_{i=k}^{n-1}a(i)b(i-k)\\ c ...

  10. 【刷题】BZOJ 4391 [Usaco2015 dec]High Card Low Card

    Description Bessie the cow is a huge fan of card games, which is quite surprising, given her lack of ...