CF312B Archer

题目传送门

分析

首先分析样例。
小 R 第一箭就射中的概率是 1 2 \frac{1}{2} 21​,但是他也有 1 2 \frac{1}{2} 21​的概率射不中,这个时候他就只能祈祷另一个人射不中,此时的概率就是 1 2 × ( 1  ⁣ −  ⁣ 1 2 ) = 1 4 \frac{1}{2}\times(1\!-\!\frac{1}{2})=\frac{1}{4} 21​×(1−21​)=41​,接着又轮到小 R,他需要射中才能赢,所以这次他获胜的概率是 1 2 ∗ 1 4 = 1 8 \frac{1}{2}*\frac{1}{4}=\frac{1}{8} 21​∗41​=81​,以此类推。
推导:
每次小 R,射完一次箭,有 a b \frac{a}{b} ba​的概率赢,但是他有 b − a b \frac{b-a}{b} bb−a​的概率射不中,此时要获胜需要对方 d + c d \frac{d+c}{d} dd+c​的概率也射不中,在轮到小 R,以 a b \frac{a}{b} ba​的概率来射。
令 X = b − a b × d + c d X=\frac{b-a}{b}\times\frac{d+c}{d} X=bb−a​×dd+c​,小 R 获胜的概率为:
a b + a b ⋅ X + a b ⋅ X 2 + a b ⋅ X 3 + … \frac{a}{b}+\frac{a}{b}\cdot X+\frac{a}{b}\cdot X^2+\frac{a}{b}\cdot X^3+\ldots ba​+ba​⋅X+ba​⋅X2+ba​⋅X3+…
可以发现这是一个等比数列。
设原式为 S S S,因为 x < 0 x<0 x<0,所以 x ∞ ≈ 0 x^\infty\approx0 x∞≈0,那么 S ≈ a b S\approx\frac{a}{b} S≈ba​。
S ⋅ X = a b ⋅ X + a b ⋅ X 2 + a b ⋅ X 3 + … S\cdot X=\frac{a}{b}\cdot X+\frac{a}{b}\cdot X^2+\frac{a}{b}\cdot X^3+\ldots S⋅X=ba​⋅X+ba​⋅X2+ba​⋅X3+…
用 S S S 减去 S ⋅ X S\cdot X S⋅X得到 S ⋅ ( 1 − X ) = a b − X ∞ ≈ a b S\cdot(1-X)=\frac{a}{b}-X^\infty\approx\frac{a}{b} S⋅(1−X)=ba​−X∞≈ba​,那么:
S = S ⋅ ( 1 − X ) 1 − X = a b 1 − X S=\frac{S\cdot(1-X)}{1-X}=\frac{\frac{a}{b}}{1-X} S=1−XS⋅(1−X)​=1−Xba​​
所以,最后的答案就是:
a b 1 − b − a b × d + c d \frac{\frac{a}{b}}{1-\frac{b-a}{b}\times\frac{d+c}{d}} 1−bb−a​×dd+c​ba​​

#include<bits/stdc++.h>
using namespace std;
signed main(){
	double a,b;
	scanf("%lf%lf",&a,&b);
	double x=a/b;
	double nox=1-x;
	scanf("%lf%lf",&a,&b);
	double y=a/b;
	double noy=1-y;
	double ans=x/(1-nox*noy);
	printf("%.13lf",ans);
}
posted on 2025-07-07 19:57  fish2012  阅读(23)  评论(0)    收藏  举报  来源