← Home
```go
package main

import "fmt"

func main() {
	var w, b int
	fmt.Scan(&w, &b)

	dp := make([][]float64, w+1)
	for i := range dp {
		dp[i] = make([]float64, b+1)
	}

	for i := 1; i <= w; i++ {
		dp[i][0] = 1.0
	}

	for i := 1; i <= w; i++ {
		for j := 1; j <= b; j++ {
			// Probability Princess picks White immediately
			pWinDirect := float64(i) / float64(i+j)

			// Probability Princess continues the game:
			// 1. Princess picks Black: j / (i+j)
			// 2. Dragon picks Black: (j-1) / (i+j-1)
			// If Dragon picks White, Princess loses immediately (prob 0 for winning).
			// If Dragon picks Black, a random mouse jumps out.
			pContinue := 0.0
			if j >= 2 {
				// Denominator for the jump event
				denomJump := float64(i + j - 2)
				
				// Case A: White mouse jumps out
				pJumpWhite := float64(i) / denomJump
				valJumpWhite := dp[i-1][j-2]
				
				// Case B: Black mouse jumps out
				pJumpBlack := float64(j-2) / denomJump
				valJumpBlack := 0.0
				if j >= 3 {
					valJumpBlack = dp[i][j-3]
				}

				pNext := pJumpWhite*valJumpWhite + pJumpBlack*valJumpBlack
				
				// Combined probability for this branch
				pPrincessBlack := float64(j) / float64(i+j)
				pDragonBlack := float64(j-1) / float64(i+j-1)
				
				pContinue = pPrincessBlack * pDragonBlack * pNext
			}

			dp[i][j] = pWinDirect + pContinue
		}
	}

	fmt.Printf("%.10f\n", dp[w][b])
}
```