[ARC186E] Missing Subsequence 题解

Description

给定一个整数序列 (X1,,XM)\left(X_1, \ldots, X_M\right) ,其长度为 MM,元素取值为 1,,K1, \ldots, K

要求找出长度为 NN 的序列 (A1,,AN)(A_1, \ldots, A_N) 的数量,元素取值为 1,,K1, \ldots, K,并满足以下条件,结果取模 998244353998244353

  • 在所有长度为 MM 的序列中,唯一不能作为 (A1,,AN)(A_1, \ldots, A_N) 的(不一定连续的)子序列的序列是 (X1,,XM)(X_1, \ldots, X_M)

2M,KN400,1XiK2\leq M,K\leq N\leq 400,1\leq X_i\leq K

Solution

不妨设 F({x1,x2,,xm})F(\{x_1,x_2,\ldots,x_m\}) 表示所有满足除了 xx 的长度为 mm 的序列都是其子序列的序列集合。

考虑一个序列 aa 什么时候可以满足条件。

iix1x_1aa 里面第一次出现的位置,容易发现除了 x1x_1 的颜色都在 a1,a2,,ai1a_1,a_2,\ldots,a_{i-1} 出现了,且 (ai+1,ai+2,,an)F({x2,x3,,xm})(a_{i+1},a_{i+2},\ldots,a_n)\in F(\{x_2,x_3,\ldots,x_m\})

然后经过手玩一下会发现这个条件在 x1=x2x_1=x_2 的情况下还是充分条件。

证明就考虑如果满足了这两个条件,第一位为 x1x_1 的子序列一定都满足条件。

否则设第一位为 ss,若第二位为 x1x_1,则第二位匹配 ii,根据第二个条件所有长度小于 m1m-1 的序列都出现在 ai+1a_{i+1} 之后。如果第二位不为 x1x_1,根据第二个条件 x2,x3,,xmx_2,x_3,\ldots,x_m 也一定出现在 ai+1a_{i+1} 之后。


对于 x1x2x_1\neq x_2 的情况,设 jjx2x_2a1,a2,,ai+1a_1,a_2,\ldots,a_{i+1} 最后一个出现位置,那么还需要满足除了 x1x_1 的颜色都在 a1,a2,,aj1a_1,a_2,\ldots,a_{j-1} 出现。

下面证明一下必要性。对于一个合法的序列 aa,如果存在颜色 cc 使得 cc 第一次出现位置在 [j+1,i1][j+1,i-1] 内,则 c,x2,x3,,xmc,x_2,x_3,\ldots,x_m 这个序列的除了 cc 的部分只能从 i+1i+1 匹配起,而根据第二个条件这个东西一定是匹配不出来的,矛盾。

充分性证明和 x1=x2x_1=x_2 的情况差不多,这里就不写了。


求方案数时设 fi,jf_{i,j} 表示长度为 ii 的序列满足 xj,xj+1,,xmx_j,x_{j+1},\ldots,x_m 的条件的数量,转移直接枚举 xjx_j 第一次出现的位置和 xj+1x_{j+1}xjx_j 第一次出现之前的最后位置即可。

时间复杂度:O(n2m+n2k)O(n^2m+n^2k)

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <bits/stdc++.h>

// #define int int64_t

const int kMaxN = 405, kMod = 998244353;

int n, m, k;
int x[kMaxN], f[kMaxN][kMaxN], coef[kMaxN], C[kMaxN][kMaxN], cnt[kMaxN][kMaxN];

constexpr int qpow(int bs, int64_t idx = kMod - 2) {
int ret = 1;
for (; idx; idx >>= 1, bs = (int64_t)bs * bs % kMod)
if (idx & 1)
ret = (int64_t)ret * bs % kMod;
return ret;
}

inline int add(int x, int y) { return (x + y >= kMod ? x + y - kMod : x + y); }
inline int sub(int x, int y) { return (x >= y ? x - y : x - y + kMod); }
inline void inc(int &x, int y) { (x += y) >= kMod ? x -= kMod : x; }
inline void dec(int &x, int y) { (x -= y) < 0 ? x += kMod : x; }

void prework() {
C[0][0] = 1;
for (int i = 1; i <= 400; ++i) {
C[i][0] = 1;
for (int j = 1; j <= i; ++j)
C[i][j] = add(C[i - 1][j], C[i - 1][j - 1]);
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= k; ++j) {
cnt[i][j] = qpow(j, i);
for (int s = 1; s < j; ++s) dec(cnt[i][j], 1ll * cnt[i][s] * C[j][s] % kMod);
// std::cerr << cnt[i][j] << ' ';
}
// std::cerr << '\n';
}
}

void dickdreamer() {
std::cin >> n >> m >> k;
for (int i = 1; i <= m; ++i) std::cin >> x[i];
prework();
for (int i = 1; i <= n; ++i) {
f[m][i] = cnt[i][k - 1];
// std::cerr << f[m][i] << ' ';
}
// std::cerr << '\n';
for (int i = 1; i <= n; ++i) {
for (int j = 1; j < i; ++j)
inc(coef[i], 1ll * cnt[j - 1][k - 1] * qpow(k - 2, i - 1 - j) % kMod);
}
for (int i = m - 1; i; --i) {
for (int j = 1; j <= n; ++j) {
if (x[i] == x[i + 1]) {
for (int s = 1; s <= j; ++s) {
inc(f[i][j], 1ll * cnt[s - 1][k - 1] * f[i + 1][j - s] % kMod);
// std::cerr << "fuck " << j << ' ' << s << ' ' << cnt[s - 1][k - 1] << ' ' << f[i + 1][j - s] << '\n';
}
} else {
for (int s = 1; s <= j; ++s)
inc(f[i][j], 1ll * coef[s] * f[i + 1][j - s] % kMod);
}
// std::cerr << f[i][j] << ' ';
}
// std::cerr << '\n';
}
std::cout << f[1][n] << '\n';
}

int32_t main() {
#ifdef ORZXKR
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);
int T = 1;
// std::cin >> T;
while (T--) dickdreamer();
// std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n";
return 0;
}

[ARC186E] Missing Subsequence 题解
https://sobaliuziao.github.io/2024/10/29/post/c2571226.html
作者
Egg_laying_master
发布于
2024年10月29日
许可协议