莓良心

莓在执行任务时,收集到了 n 份岩浆能源, 其中第 i 份的能量值是 wi ,她 决定将它们分成恰好 k 组带回基地,每一组都要有至少 1 份能源。 每一组能源会对运输设备产生负荷值,若该组有 x 份能源,这 x 份能源能 量值之和为 y , 则产生的负荷值为 x × y 。 每种分组方案产生的负荷是每一组能源产生的负荷值总和,莓想知道所有可 能的分组方案产生的负荷之和对 998244353 取模的结果。

每个\(w-i\)贡献是\(\sum w-i\times |S|\)

也就是一个集合里和每个数配对一下就产生一次贡献。

\(w-i\)在所有可能的集合中自己和自己配对\(w-i\times \begin{Bmatrix}n \\ k\end{Bmatrix}\)
枚举和其他点在一个集合\((w-i+w-j)\times \begin{Bmatrix}n-1 \\ k\end{Bmatrix}\)

\(ans=\sum(w-i)(\begin{Bmatrix}n \\ k\end{Bmatrix}+(n-1)\begin{Bmatrix}n-1 \\ k\end{Bmatrix})\)

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
#include <cstdio>
using namespace std;

const int N = 1e6 + 5, MOD = 998244353;
int n, k, sum, fac[N], ifac[N];

int fpow(int a, int b) {
int res = 1;
for (; b; b >>= 1, a = a * 1ll * a % MOD) if (b & 1) res = res * 1ll * a % MOD;
return res;
}
int C(int n, int k) {
if (k > n) return 0;
return fac[n] * 1ll * ifac[k] % MOD * 1ll * ifac[n - k] % MOD;
}
int S(int n, int k) {
int res = 0;
for (int i = 0; i <= k; i++) {
int g = (i & 1) ? -1 : 1;
g = g * 1ll * fpow(k - i, n) % MOD * C(k, i) % MOD;
g = (g + MOD) % MOD;
res = (res + g) % MOD;
}
res = res * 1ll * ifac[k] % MOD;
return res;
}

int main() {
freopen("ichigo.in", "r", stdin);
freopen("ichigo.out", "w", stdout);
scanf("%d %d", &n, &k);
for (int i = 1, x; i <= n; i++) scanf("%d", &x), sum = (sum + x) % MOD;
fac[0] = 1;
for (int i = 1; i <= n; i++) fac[i] = fac[i - 1] * 1ll * i % MOD;
ifac[n] = fpow(fac[n], MOD - 2);
for (int i = n - 1; i >= 0; i--) ifac[i] = ifac[i + 1] * 1ll * (i + 1) % MOD;
printf("%lld\n", sum * 1ll * (S(n, k) * 1ll + (n - 1) * 1ll * S(n - 1, k) % MOD) % MOD);
return 0;
}