石子染色
题目描述
Bob
\text{Bob}
Bob 将
x
x
x 个石子分为
n
n
n 堆(
1
≤
n
,
x
≤
2000
1\leq n,x \leq 2000
1≤n,x≤2000),第
i
i
i 堆有
a
i
a_i
ai 个。
Bob
\text{Bob}
Bob
会从数列
{
p
n
}
:
p
i
=
i
\{p_n\}:p_i=i
{pn}:pi=i(
1
≤
i
≤
n
1\leq i\leq n
1≤i≤n)中任意选择若干个数组成集合
S
S
S。对于任意的
i
i
i(
1
≤
i
≤
n
1\leq i\leq n
1≤i≤n),若
i
∈
S
i\in S
i∈S,那么
Bob
\text{Bob}
Bob 会将第
i
i
i
堆染为红色,反之染为蓝色。记红色的石子总个数为
r
r
r,蓝色的石子总个数为
b
b
b,映射
f
f
f 满足
f
(
S
)
=
∣
r
−
b
∣
f(S)=|r-b|
f(S)=∣r−b∣。 当
S
S
S 取遍时,求
[
∑
f
(
S
)
]
m
o
d
998244353
\left[\sum f(S)\right] \bmod 998244353
[∑f(S)]mod998244353 的值。
格式
Input
第一行为一个数 T T T( T ≤ 3 T\leq3 T≤3),表示数据组数。
对于每组数据,第一行为两个数 x , n x,n x,n;第二行有 n n n 个数,表示 a 1 , a 2 , ⋯ , a n a_1,a_2,\cdots,a_n a1,a2,⋯,an。
Output
[ ∑ f ( S ) ] m o d 998244353 \left[\sum f(S)\right] \bmod 998244353 [∑f(S)]mod998244353 的值。
分析
我们知道
f ( S ) = ∣ r − b ∣ , x = r + b f(S) = |r-b|,\ x=r+b f(S)=∣r−b∣, x=r+b
那么有
f ( S ) = ∣ x − 2 b ∣ f(S) = |x-2b| f(S)=∣x−2b∣
我们设 S S S 的所有元素值和为 i i i 的 S S S 有 s i s_i si 个,那么就有
∑ f ( S ) = ∑ ∣ r − b ∣ = ∑ ∣ x − 2 b ∣ = ∑ i = 1 x s i ∣ x − 2 i ∣ \sum f(S) = \sum|r-b| = \sum|x-2b| = \sum_{i=1}^{x}s_i|x-2i| ∑f(S)=∑∣r−b∣=∑∣x−2b∣=i=1∑xsi∣x−2i∣
Code
#include <bits/stdc++.h>
#define MOD 998244353
using namespace std;
long long x, n, s[2005];
int T;
int main()
{
// freopen("color.in", "r", stdio);
// freopen("color.out", "w", stdio);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> T;
while (T--)
{
memset(s, 0, sizeof s);
s[0] = 1;
cin >> x >> n;
for (int i(1), k; i <= n; ++i)
{
cin >> k;
for (int j(x); j >= k; --j)
s[j] = (s[j] + s[j - k]) % MOD;
}
long long ans = 0;
for (int i(0); i <= x; ++i)
ans = (ans + abs(x - 2 * i) % MOD * s[i] % MOD) % MOD;
cout << ans << "\n";
}
}