- 一开始有(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='/')