At298 E - Unfair Sugoroku

E.Unfair Sugoroku


原题链接

题意简述

两个人在数轴上掷骰子玩游戏,A从点a开始,B从点b开始。A的骰子有1,2.....p个点,B的骰子有1,2.....q个点,谁先到n点谁就获胜,从A先开始,求A胜利的概率(mod 998244353下逆元表示)。

解题思路

从最后胜利状态开始考虑,他一定是由前一个状态转移过来,规定 \(dp_{ij}\) 表示 \(A\) 走到 \(i\) 号位置,\(B\) 走到 \(j\) 号位置,则$dp_{min(i+k,n),min(j+l,n)}=\sum_{k \leq p,l \leq q} dp_{i,j} $,注意取模和枚举顺序即可

AC code

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
const ll mod=998244353;
ll q_pow(ll a,ll b){
    ll s=1;
    while(b){
        if(b&1){
            s=s*a%mod;
        }
        b>>=1;
        a=a*a%mod;
    }
    return s;
}
ll inv(ll x){
    return q_pow(x,mod-2);
}
int main(){
    cin.tie(0)->ios::sync_with_stdio(false);
    int n,a,b,p,q;
    cin>>n>>a>>b>>p>>q;
    vector<vector<ll> >f(n+1,vector<ll>(n+1) );
    f[a][b]=1;
    for(int i=a;i<n;i++){
        for(int j=b;j<n;j++){
            for(int k=1;k<=p;k++){
                for(int l=1;l<=q;l++){
                    f[min(i+k,n)][min(j+l,n)]=(f[min(i+k,n)][min(j+l,n)]+f[i][j]*inv(p*q%mod)%mod)%mod;
                }
            }
        }
    }
    ll ans=0;
    for(int i=1;i<=n;i++) ans=(ans+f[n][i])%mod;
    cout<<ans<<endl;
    return 0;
}
posted @ 2025-05-23 21:17  usedchang  阅读(19)  评论(0)    收藏  举报