猕猴桃 T4
Register_int · · 题解
对于一个点
你发现叶子是最特殊的,因为它必然只有一个大小为
有啥用呢?你还会发现更加奇妙的事情。考虑一个节点若有大小为
从小到大枚举
有更聪明的实现方法,因为对于大小
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 3e5 + 10;
const int mod = 998244353;
inline
int qpow(int b, int p) {
int res = 1;
for (; p; p >>= 1, b = (ll)b * b % mod) if (p & 1) res = (ll)res * b % mod;
return res;
}
int n, m, a[MAXN], c1[MAXN], c2[MAXN], fac[MAXN], ifac[MAXN], ans = 1;
int main() {
scanf("%d", &n), *fac = 1;
for (int i = 1; i <= n; i++) fac[i] = (ll)fac[i - 1] * i % mod;
ifac[n] = qpow(fac[n], mod - 2);
for (int i = n; i; i--) ifac[i - 1] = (ll)ifac[i] * i % mod;
for (int i = 1; i <= n; i++) {
scanf("%d", &m);
for (int j = 1; j <= m; j++) scanf("%d", &a[j]), c1[a[j]]++, c2[a[j]]++;
for (int j = 1; j <= m; j++) {
if (a[j] < (n + 1) / 2) ans = (ll)ans * ifac[c1[a[j]]] % mod;
c1[a[j]] = 0;
}
}
for (int i = n / 2 + 1; i < n; i++) ans = (ll)ans * fac[c2[i]] % mod;
printf("%d", ans);
}
做完这题可以去做猫娘。