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)) }