题意:有 1到n个格子,初始在1号格子,每个格子上有a[i],等概率的抽取0到a[i]中的数,使得前进该数格,求到n格时抽取的期望次数。
思路:dp[i]表示i到n的期望次数。然后前缀和优化一下即可。
总结:期望dp常见的状态有1到i的次数和i到n的次数,或者i到i+1的期望===
/*keep on going and never give up*/
#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
#define int long long
typedef pair<int, int> pii;
#define lowbit(x) x&(-x)
#define endl '\n'
#define wk is zqx ta die
const int mod = 998244353;
int dp[200005];
int sum[200005];
int a[200005];
int pow(int a, int b) {
int res = 1;
while (b) {
if (b & 1) {
res = res * a % mod;
}
a = a * a % mod;
b >>= 1;
}
return res;
}
signed main() {
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
for (int i = 1; i < n; i++) {
cin >> a[i];
}
dp[n] = 0;
sum[n] = 0;
for (int i = n - 1; i >= 1; i--) {
dp[i] = (sum[i + 1] - sum[i + a[i] + 1] + mod + a[i]) % mod + 1;
dp[i] %= mod;
dp[i] = dp[i] * pow(a[i], mod - 2) % mod;
sum[i] = sum[i + 1] + dp[i];
}
cout << dp[1] << endl;
return 0;
}