题解:P11617 递推
chenly8128 · · 题解
简单题,稍微推推就好了。
题解
主要利用
| 总和 | |||||
|---|---|---|---|---|---|
| 0 | |||||
| 0 | |||||
| 0 | |||||
| 0 | |||||
| 总和 | 0 |
最关键的是最后一行,最后一行
整理一下:
因此:
上下面都算出来,最后乘法逆元算一下乘起来就行了。
代码
// Author: chenly8128
// Created: 2025-01-25 14:07:20
#include <bits/stdc++.h>
#define int long long
const int mod = 998244353;
const int MAXN = 5e3+10;
using namespace std;
inline int read(void) {
int res = 0;bool flag = true;char c = getchar();
while (c < '0' || c > '9') {flag ^= (c == '-');c = getchar();}
while (c >= '0' && c <= '9') {res = (res << 3) + (res << 1) + (c ^ 48);c = getchar();}
return flag ? res : -res;
}
int qpow (int a,int k) {
int ans = 1;
while (k) {
if (k&1) ans = ans * a % mod;
a = a * a % mod;
k >>= 1;
}
return ans;
}
int n,a[MAXN],r[MAXN];
signed main (void) {
n = read();
for (int i = 0;i < n;i++) a[i] = read();
int sum = 0,res = 0,sum2 = 0;
for (int i = 0;i <= n;i++)
r[i] = read();
for (int i = n;i >= 0;i--) {
sum2 = (sum2 + r[i]) % mod;
sum = (sum + res * r[i]) % mod;
res = (res + a[n-i]) % mod;
}
printf ("%lld\n",sum * qpow(sum2,mod-2) % mod);
return 0;
}