题解:CF2125E Sets of Complementary Sums
如果将
- 将
a 的所有值都增加或减少同一个数; - 在
a 最后添加一个已经出现过的数。
因为这两种操作的本质都是将
如果要用某个
- 最小值为
1 ; - 没有重复元素。
如果最小值不为
用这样的
另一个问题是,一个等价类中的
这样考虑,从那个基本的
也就是说,对于最终答案的计算,我们并不需要得知
另外这个「
然后 DP。设
注意到,初始令
- 将
a 全部加一; - 将
a 全部加一,接着在a 开头添加一个1 。
相对应的可以得到转移方程:
同时注意到
最后因为神秘原因需要特判一下
#include <bits/stdc++.h>
using namespace std;
const int P = 998244353, N = 2e5 + 10, M = 800;
int f[M][N];
int n, x;
int dp(int n, int s) {
if (n >= M || s < 0) return 0;
return f[n][s];
}
int solve() {
cin >> n >> x;
if (n == 1) return x;
int res = 0;
for (int s = 1; s <= x + 1; ++ s ) {
res = (res + 1ll * dp(n - 1, s - n) * (x - s + 2)) % P;
}
return res;
}
signed main() {
f[0][0] = 1;
for (int i = 1; i < M; ++ i )
for (int j = i * (i + 1) / 2; j < N; ++ j ) {
f[i][j] = (f[i][j - i] + f[i - 1][j - i]) % P;
}
int T;
cin >> T;
while (T -- ) cout << solve() << '\n';
return 0;
}