zoukankan      html  css  js  c++  java
  • #3328. 开箱子(unboxing)

    题目描述

    开箱子是守望先锋中一项重要的活动, $50$ 箱多少金决定了你到底是欧皇还是部落酋长。

    现在我们假设有两种箱子,一种是你升级得的,另一种是氪金的,分别有一个参数 $p_1,p_2$,你有 $frac{1}{p}(1- frac{1}{p})^{k-1}$的概率在得到箱子的 $k$ 秒后开箱,注意箱子是一个一个给你的,也就是说上一个箱子开完后下一个箱子才会开始算时间。

    现在有 $l_1$ 个升级得到的箱子, $l_2$个氪金得到的箱子,两种箱子的第一个箱子是同时间给你的,告诉你 $p_1,p_2$,问你升级得到的箱子开完的时间严格小于氪金的箱子开完的时间的概率,为了避免精度问题,输出对 $998244353$ 取模。

    数据范围

    对于所有数据满足 $ l_1,l_2 in [0,2 imes 10^3],p_1,p_2 in [1,10^9] $ ,我们规定 $ 0^0=1 $ 。

    题解

    挺简单的一道题考场想歪了哭辽

    考虑 $dp$ , $f_{i,j}$ 表示升级箱开了 $i$ 个,氪金箱开了 $j$ 个的概率

    考虑主动转移,如果升级箱开了第 $i+1$ 个,则可以列出转移式子:
    $f_{i+1,j}+=f_{i,j} imes frac{1}{p_1} imes (1-frac{1}{p_2}) imes (frac{1}{1-(1-frac{1}{p_1}) imes(1-frac{1}{p_2})})$

    最后这个是中途没有人选的概率

    剩下的转移类似,注意到i=n或者j=m的时候不能转移、

    效率: $O(l_1 imes l_2)$

    代码

    #include <bits/stdc++.h>
    using namespace std;
    const int P=998244353,N=2005;
    int n,m,p,q,f[N][N],s,w;
    int K(int x){
        int z=1;
        for (int y=P-2;y;y>>=1,x=1ll*x*x%P)
            if (y&1) z=1ll*z*x%P;
        return z;
    }
    int main(){
        cin>>n>>m>>p>>q;f[0][0]=1;
        p=K(p);q=K(q);w=K(1-1ll*(1-p)*(1-q)%P);
        for (int i=0;i<n;i++)
            for (int j=0;j<m;j++){
                (f[i+1][j]+=1ll*f[i][j]*p%P*(1-q)%P*w%P)%=P;
                (f[i][j+1]+=1ll*f[i][j]*q%P*(1-p)%P*w%P)%=P;
                (f[i+1][j+1]+=1ll*f[i][j]*p%P*q%P*w%P)%=P;
            }
        for (int j=0;j<m;j++) (s+=f[n][j])%=P;
        return printf("%d
    ",(s+P)%P),0;
    }
  • 相关阅读:
    Python异常捕捉try except else finally有return时执行顺序探究
    为什么在Python的线程内调用sys.exit()时不退出?
    Hadoop集群上用户使用crontab时候失败
    记一次--------spark 读 mysql 报错no suitable driver
    通用权限sql设计
    union all 对结果进行分类展示
    雷达图
    常用语句
    oracle中计算两个日期的相差天数、月数、年数、小时数、分钟数、秒数等
    icell设计器发送邮件不成功
  • 原文地址:https://www.cnblogs.com/xjqxjq/p/11323335.html
Copyright © 2011-2022 走看看