CF2119D Token Removing 题解
vegetable_king · · 题解
出题人题解。附上题目中歌曲的 B 站链接:r-906 & Hatsune Miku - あなたしか見えないの。
抱歉,我错误地判断了问题 D 的难度。
提示
计算单个有效序列的权重很困难。试试其他方法?
题解
考虑首先确定最后有哪些 token 被移除了。然后我们需要对于每个将要被移除的 token,假设这个 token 位于
我们使序列
假设这些 token 的位置分别为
最后答案即为
代码实现
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int N = 5005;
int t, n, mod, f[N][N], ans;
inline void add(int& x, int y){x += y;if (x >= mod) x -= mod;}
int main(){scanf("%d", &t);
while (t --){scanf("%d%d", &n, &mod), f[0][0] = 1, ans = 0;
for (int i = 1;i <= n;i ++) for (int j = 0;j <= i;j ++) f[i][j] = 0;
for (int i = 1;i <= n;i ++)
for (int j = 0, now;j < i;j ++)
if (now = f[i - 1][j]) add(f[i][j + 1], now),
f[i][j] = (f[i][j] + (n - i + 1ll) * (j + 1) * now) % mod;
for (int j = 0;j <= n;j ++) add(ans, f[n][j]);printf("%d\n", ans);
}
}