把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

【洛谷4204】[NOI2006] 神奇口袋(结论题)

点此看题面

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

重要结论

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

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

\[\begin{aligned} P&=\frac{a_1}{tot}\times\frac{a_1+d}{tot+d}+\frac{tot-a_1}{tot}\times\frac{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='/')
posted @ 2021-04-08 12:59  TheLostWeak  阅读(75)  评论(0编辑  收藏  举报