题解:CF2001E1 Deterministic Heap (Easy Version)
写篇题解!
首先根据套路,不难设计出状态
之后根据题意,可以转移的充要条件即是根节点的两个儿子权值不等(这样一定是往权值大的儿子的子树转移,与另一颗无关)。所以我们由此设计出另一状态,
可以得到:
这个式子的本质就是:枚举根节点两个儿子的和
同理,我们也可以得到
区别就是
由此得到了一种
观察得知,枚举
这里的
同样地,
最后的
给出核心代码:
inline void Solve() {
scanf("%d %d %d", &n, &K, &P);
Sg[0] = 0ll;
for (int i = 0; i <= K; i++) {
f[1][i] = g[1][i] = 1ll;
Sg[i + 1] = (Sg[i] + g[1][i]) % P;
}
for (int i = 2; i <= n; i++) {
auto Sumg = [&](int l, int r) {
return l > r ? 0ll : (Sg[r + 1] - Sg[l]) % P;
};
for (int j = 0; j <= K; j++) {
f[i][j] = g[i][j] = 0ll;
for (int x = 0; x <= j; x++) {
f[i][j] = (f[i][j] + 2ll * f[i - 1][x] * Sumg(0, std::min(x - 1, j - x)) % P) % P;
g[i][j] = (g[i][j] + 1ll * g[i - 1][x] * Sumg(0, j - x) % P) % P;
}
}
Sg[0] = 0ll; for (int j = 0; j <= K; j++) Sg[j + 1] = (Sg[j] + g[i][j]) % P;
}
printf("%lld\n", f[n][K]);
return;
}
更多思考,其实求解
考虑通俗化,有
有多少组非负整数解。我们设
有多少组正整数解(因为一个
根据经典的隔板法,考虑有
因此