import random
from math import prod

def analytical(n):
	p_no_match = prod((365 - k) / 365 for k in range(n))
	return 1 - p_no_match

def simulate(n, trials=100_000):
	matches = 0
	for _ in range(trials):
		birthdays = [random.randint(1, 365) for _ in range(n)]
		if len(set(birthdays)) < n:
			matches += 1
	return matches / trials

print("n  analytical  simulated")
for n in range(1, 60):
	a = analytical(n)
	s = simulate(n)
	marker = " <-- crosses 50%" if a >= 0.5 and analytical(n - 1) < 0.5 else ""
	print(f"{n}  {a:.1%}  {s:.1%}{marker}")
