专栏文章
题解:AT_abc399_f [ABC399F] Range Power Sum
AT_abc399_f题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miprs01j
- 此快照首次捕获于
- 2025/12/03 16:53 3 个月前
- 此快照最后确认于
- 2025/12/03 16:53 3 个月前
这次的F题有点难度,估计可以评个绿题吧。
思路
此题可以用DP+二项式定理解决。
我们设 ,然后我们考虑转移。
然后根据二项式定理 :
如果我们将 看做 , 看做 。
那么原式就变成了:
然后观察一下中间的这个式子 , 这不就是 吗!
所以最后的转移方程就长这样:
最终的结果就是 。
代码
CPP#include <bits/stdc++.h>
#define endl '\n'
#define int long long
const int Mod = 998244353;
signed main (void) {
std :: ios :: sync_with_stdio (false);
std :: cin.tie (nullptr);
std :: cout.tie (nullptr);
int N, K;
std :: cin >> N >> K;
std :: vector <int> A (N + 1);
for (int i = 1; i <= N; ++ i) {
std :: cin >> A[i];
}
std :: vector <std :: vector <int> > F (K + 1);
F[0].resize (K + 1);
F[0][0] = 1;
for (int i = 1; i <= K; ++ i) {
F[i].resize (K + 1);
F[i][0] = F[i][i] = 1;
for (int j = 1; j < i; ++ j) {
F[i][j] = F[i - 1][j] + F[i - 1][j - 1] % Mod;
}
}
std :: vector <int> Result (K + 1), Presult (K + 1), Comb (K + 1);
int Answer = 0;
for (int i = 1; i <= N; ++ i) {
Comb[0] = 1;
for (int j = 1; j <= K; ++ j) {
Comb[j] = Comb[j - 1] * A[i] % Mod;
}
for (int k = 0; k <= K; ++ k) {
Result[k] = Comb[k];
for (int j = 0; j <= k; ++ j) {
Result[k] = (Result[k] + Presult[j] * F[k][j] % Mod * Comb[k - j]) % Mod;
}
}
Answer += Result[K];
Answer %= Mod;
Presult = Result;
}
std :: cout << Answer << endl;
return 0;
}
完结撒花🎉🎉🎉
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...