1package main23import (4 "fmt"5 "math/big"6 "sync"7)89const (10 NONE = iota11 DARK = iota12 MILK = iota13)1415const (16 maxDark = 817 maxMilk = 218 totalChocolates = maxDark + maxMilk19)2021var ansChan chan *big.Rat2223func recurse(milkEaten, darkEaten int64, prob *big.Rat, cur int, str string) {24 if milkEaten == maxMilk && darkEaten == maxDark {25 fmt.Println(str)26 if cur == MILK {27 ansChan <- prob28 }29 return30 }3132 if darkEaten < maxDark {33 newProb := new(big.Rat)34 newProb.Mul(prob, big.NewRat(maxDark-darkEaten, totalChocolates-darkEaten-milkEaten))35 switch cur {36 case NONE:37 fallthrough38 case DARK:39 recurse(milkEaten, darkEaten+1, newProb, DARK, str+"D")40 case MILK:41 recurse(milkEaten, darkEaten, newProb, NONE, str+"d")42 }43 }4445 if milkEaten < maxMilk {46 newProb := new(big.Rat)47 newProb.Mul(prob, big.NewRat(maxMilk-milkEaten, totalChocolates-darkEaten-milkEaten))48 switch cur {49 case NONE:50 fallthrough51 case MILK:52 recurse(milkEaten+1, darkEaten, newProb, MILK, str+"M")53 case DARK:54 recurse(milkEaten, darkEaten, newProb, NONE, str+"m")55 }56 }5758}5960func main() {61 ansChan = make(chan *big.Rat)62 var wg sync.WaitGroup63 wg.Add(1)64 go func() {65 total := big.NewRat(0, 1)66 for ans := range ansChan {67 total.Add(total, ans)68 }69 fmt.Printf("%d/%d\n", total.Num(), total.Denom())70 wg.Done()71 }()7273 recurse(0, 0, big.NewRat(1, 1), NONE, "")74 close(ansChan)75 wg.Wait()76}