题解:P12374 「LAOI-12」Sigma
本题解会从最基础的开始讲,然后逐渐优化到满分做法。
以下内容中
Subtask 1:我会模拟!
直接根据题目意思模拟,时间复杂度
期望得分:
Subtask 2:我会数学!
因为
由于这里都是加法,那么每个求和符号之间实际上是相互独立的。那么,这里求和符号的顺序就可以随意交换。假设在一个式子中,第
直接对着这个式子算即可,时间复杂度
期望得分:
Subtask 3 & 4:我会逆元!
将上面式子写成另外一种形式:
于是
于是这个式子中所有式子都可以在循环的过程中算出来。由于要取模,所以需要用到
注意精细取模。
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed a[5005], c[5005];
const int mod = 998244353;
signed main() {
int n, ans = 0; scanf("%d", &n);
for(int i = 1;i <= n;i++) scanf("%d", &a[i]);
for(int i = 1;i <= n;i++) {
int sum = 1, ssum = 0;
for(int j = i;j <= n;j++) {
if(a[j] < (j-i+1)) break;
c[j] = (1ll * (j-i+1+a[j]) * 499122177) % mod;
sum = (sum * (a[j]-j+i)) % mod; ssum = (ssum + c[j]) % mod;
ans = (ans + (sum * (ssum % mod)) % mod) % mod;
}
} printf("%d\n", ans);
return 0;
}