不会markdown将就着看吧:)
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 5, MOD = 998244353;
int x[N], y[N], dp[N];
int ksm(int x, int y)
{
int res = 1;
while(y)
{
if (y & 1) res = res * x %MOD;
x = x * x % MOD;
y >>= 1;
}
return res;
}
signed main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++) cin >> x[i] >> y[i];
for (int i = 1; i <= n; i++)
{
int inv = ksm(y[i] - x[i], MOD - 2);
dp[i] = y[i] * (dp[i - 1] + 1) % MOD * inv % MOD;
}
cout << dp[n];
}
正推两种思路 第一种 有(1 - pi)的概率爬上一层 所以期望是 1/(i - pi)次可以爬一层 得到dp转移 dp[i + 1] = 1 / (1 - pi) * (dp[i] + 1) ,因为如果掉落需要重新爬回i位置 所以每次尝试的代价是 1 + dp[i], 相当于爬失败了重置状态的代价
第二种 E(i) = p1 * x1 + p2 * x2+..... E(i + 1) = p1 * (x1 + w1) + ...;所以 E(i + 1) = p1 * x1 + ... + p1 * w1 + ... = E(i) + p1 * w1 + ...; E(i)已知, 而p1 * w1 + p2 * w2 + ...即为pi * dp[i + 1],也就是额外付出的代价 所以dp[i + 1] = dp[i] + 1 + pi * dp[i + 1],将公式化简可得dp[i + 1] = 1 / (1 - pi) * (dp[i] + 1) 感性理解就是有pi的几率我要额外花费掉dp[i + 1]的时间 所以额外花费是pi * dp[i + 1] 但是因为dp[i] + 1这段花费是必须会付出的 跟pi无关 无论你pi是多少一定会有dp[i] + 1的花费 所以dp[i] + 1不用乘以pi 所以总的花费就是dp[i + 1] = dp[i] + 1 * pi * dp[i + 1]