Skip to content

Instantly share code, notes, and snippets.

@MagnetonBora
Created September 4, 2018 20:58
Show Gist options
  • Save MagnetonBora/f3465fa7dde595505bdc3bf6327a07aa to your computer and use it in GitHub Desktop.
Save MagnetonBora/f3465fa7dde595505bdc3bf6327a07aa to your computer and use it in GitHub Desktop.
from functools import lru_cache
@lru_cache(maxsize=None)
def calculate_probability_recursively(red, green):
if green == 0 or red == 0:
return 1
p0 = red / (red + green)
if green == 1:
return p0
return p0 + green / (red + green) * (green - 1) / (red + green - 1) * calculate_probability(red, green-2)
def calculate_probability(red, green):
if green == 0 or red == 0:
return 1
if green == 1:
return red / (red + green)
queue = [(red, green)]
while queue:
if green > 1:
green -= 2
queue.append((red, green))
else:
r, g = queue.pop()
if g == 0:
dp = 1
elif g == 1:
dp = r / (r + g)
else:
p = r / (r + g) + g / (r + g) * (g - 1) / (r + g - 1) * dp
dp = p
return p
T = int(input().strip())
for _ in range(T):
red, green = [int(el) for el in input().split(' ')]
value = calculate_probability(red, green)
print("%8.6f" % value)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment