zoukankan      html  css  js  c++  java
  • 【洛谷4204】[NOI2006] 神奇口袋(结论题)

    点此看题面

    • 一开始有(t)种颜色的球,第(i)种颜色有(a_i)个。
    • 一次取球操作会随机取出一个小球,观察它的颜色后放回,并同时放回(d)个与它同色的球。
    • 给出(n)个事件,表示第(x_i)次取球的时候取出了颜色为(y_i)的球。
    • 求一轮中发生全部(n)个事件的概率。
    • (t,nle10^3,a_i,dle10)

    重要结论

    要证明一个结论,就是一次不指定颜色的取球操作之后,可以视作没有添加球。

    以第一种颜色为例,假设球的总数为(tot),那么第二次取球抽到它的概率为:

    [egin{aligned} P&=frac{a_1}{tot} imesfrac{a_1+d}{tot+d}+frac{tot-a_1}{tot} imesfrac{a_1}{tot+d}\ &=frac{a_1(a_1+d+tot-a_1)}{tot(tot+d)}\ &=frac{a_1}{tot} end{aligned} ]

    而一次指定颜色的取球操作必然会加入(d)个这种颜色的球,直接更新(a_y)即可。

    代码:(O(n))

    def gcd(a,b):
        return a if b==0 else gcd(b,a%b)
    s=input().split()
    t=int(s[0])
    n=int(s[1])
    d=int(s[2])
    a=[0 for i in range(t+1)]
    s=input().split()
    tot=0
    for i in range(t):
        a[i+1]=int(s[i])
        tot+=a[i+1]#初始求出总球数
    A=1
    B=1
    for i in range(n):
        s=input().split()
        x=int(s[0])
        y=int(s[1])
        A*=a[y]#分子乘上a[y]
        B*=tot#分母乘上tot
        g=gcd(A,B)#求出gcd
        A//=g#约分
        B//=g#约分
        a[y]+=d#指定了这种颜色,需要给a[y]加上d
        tot+=d#总球数也加上d
    print(A,B,sep='/')
    
    败得义无反顾,弱得一无是处
  • 相关阅读:
    oracle对象之序列
    PLSql工具介绍
    oracle对象之同义词
    oracle对象之视图
    缓存问题汇总
    消息队列问题汇总
    算法-排序算法-1
    redis-主从数据一致
    数据结构与算法-完全二叉树/满二叉树
    写缓冲器与无效化队列
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/Luogu4204.html
Copyright © 2011-2022 走看看