← Home
```go
package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
	scanner.Buffer(make([]byte, 1024*1024), 1024*1024)

	if !scanner.Scan() {
		return
	}
	n, _ := strconv.Atoi(scanner.Text())
	scanner.Scan()
	m, _ := strconv.Atoi(scanner.Text())

	cnt := make([]int, 1<<m)
	for i := 0; i < n; i++ {
		scanner.Scan()
		s := scanner.Text()
		mask := 0
		for j := 0; j < m; j++ {
			if s[j] == '1' {
				mask |= 1 << j
			}
		}
		cnt[mask]++
	}

	C_all := make([]int, 1<<m)
	copy(C_all, cnt)
	for i := 0; i < m; i++ {
		for mask := (1 << m) - 1; mask >= 0; mask-- {
			if (mask & (1 << i)) == 0 {
				C_all[mask] += C_all[mask|(1<<i)]
			}
		}
	}

	C_sub := make([]int, 1<<m)
	copy(C_sub, cnt)
	for i := 0; i < m; i++ {
		for mask := 0; mask < (1 << m); mask++ {
			if (mask & (1 << i)) != 0 {
				C_sub[mask] += C_sub[mask^(1<<i)]
			}
		}
	}

	var activeMasks []int
	var activeCounts []float64
	for mask := 0; mask < (1 << m); mask++ {
		if cnt[mask] > 0 && (mask&1) == 1 {
			activeMasks = append(activeMasks, mask)
			activeCounts = append(activeCounts, float64(cnt[mask]))
		}
	}

	statesBySize := make([][]int, m+1)
	for S := 1; S < (1 << m); S += 2 {
		c := 0
		for v := S; v > 0; v >>= 1 {
			c += v & 1
		}
		statesBySize[c] = append(statesBySize[c], S)
	}

	P := make([]float64, 1<<m)
	fullMask := (1 << m) - 1

	for size := 1; size <= m; size++ {
		for _, S := range statesBySize[size] {
			var f float64
			for i, msk := range activeMasks {
				f += activeCounts[i] * P[S&msk]
			}
			W := n - C_sub[fullMask^S] - C_all[S]
			if W == 0 {
				P[S] = 1.0
			} else {
				P[S] = f / float64(W)
			}
		}
	}

	fmt.Printf("%.16f\n", P[fullMask])
}
```