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;
}

浙公网安备 33010602011771号