洛谷P8774 [蓝桥杯 2022 省 A] 爬树的甲壳虫 题解 期望DP

题目链接:https://www.luogu.com.cn/problem/P8774

思路:

fi 为甲壳虫从高度 i 到达高度 n 的期望时间。则:

因为从高度 i1 步有 1Pi+1 的概率到达高度 i+1,有 Pi+1 的概率到达高度 0,所以:

fi=1+(1Pi+1)×fi+1+Pi+1×f0

可以高斯消元,但是高斯消元没咋写过啊

f0=(1P1)f1+P1f0+1

f1=(1P2)f2+P2f0+1

f2=(1P3)f3+P3f0+1

fn1=(1Pn)fn+Pnf0+1

fn=0

考虑 f0 的系数:

X=P1+(1P1)P2+(1P1)(1P2)P3+(1P1)(1P2)(1Pn1)Pn

考虑常数项:

Y=1+(1P1)+(1P1)(1P2)++(1P1)(1P2)(1Pn1)

所以

f0=Xf0+Y

f0=Y1X

示例程序:

#include <bits/stdc++.h>
using namespace std;
const long long mod = 998244353;
typedef long long ll;
void gcd(ll a , ll b , ll &d , ll &x , ll &y) {
    if(!b) {d = a; x = 1; y = 0;}
    else { gcd(b , a%b,d,y , x); y -= x * (a/b); }
}
ll inv(ll a , ll n = mod) {
    ll d , x , y;
    gcd(a , n , d,  x , y);
    return d == 1 ? (x+n)%n : -1;
}

const int maxn = 1e5 + 5;
int n;
long long x[maxn], y[maxn], p[maxn];

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%lld%lld", x+i, y+i);
        p[i] = x[i] * inv(y[i]) % mod;
    }
    ll X = p[1], Y = 1, tmp = 1;
    for (int i = 2; i <= n; i++) {
        // tmp = tmp * (1 - p[i-1] + mod) % mod;
        tmp = tmp * (y[i-1] - x[i-1]) % mod * inv(y[i-1]) % mod;
        X = (X + tmp * p[i] % mod) % mod;
        Y = (Y + tmp) % mod;
    }
    ll ans = Y * inv((1 - X + mod) % mod) % mod;
    printf("%lld\n", ans);
    return 0;
}
posted @   quanjun  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示