package main

import (
	"fmt"
	"math/rand"
	"sort"
)

func main() {
	rand.Seed(10)
	var N int
	var PA, PB float32
	fmt.Scan(&N, &PA, &PB)
	A, B := make([]int, N), make([]int, N)
	for i := 0; i < N; i++ {
		fmt.Scan(&A[i])
	}
	for i := 0; i < N; i++ {
		fmt.Scan(&B[i])
	}
	sort.Ints(A)
	sort.Ints(B)

	sim := func() bool {

		makeDeck := func() (x, y []int) {
			x, y = make([]int, N), make([]int, N)
			for i := 0; i < N; i++ {
				x[i], y[i] = i, i
			}
			return
		}

		playGame := func(deck *[]int, cards []int, p float32) (z int) {
			L := len(*deck)
			if L > 1 && rand.Float32() > p {
				i := rand.Intn(L-1) + 1
				z = cards[(*deck)[i]]
				if i == L-1 {
					*deck = (*deck)[:(L - 1)]
				} else {
					*deck = (*deck)[:i+copy((*deck)[i:], (*deck)[i+1:])]
				}
				return
			}
			z = cards[(*deck)[0]]
			*deck = (*deck)[1:]
			return
		}

		deckA, deckB := makeDeck()
		var score int
		for i := 0; i < N; i++ {
			cardA := playGame(&deckA, A, PA)
			cardB := playGame(&deckB, B, PB)
			point := cardA + cardB
			switch {
			case cardA > cardB:
				score += point
			case cardA < cardB:
				score -= point
			default:
				fmt.Println(cardA, cardB)
				panic("not distinct!: ")
			}
		}
		return score > 0
	}

	attempt := 100000
	var win int
	for i := 0; i < attempt; i++ {
		if sim() {
			win++
		}
	}
	fmt.Printf("%f\n", 1.0*float32(win)/float32(attempt))
}