← Home
```go
package main

import (
	"bufio"
	"fmt"
	"math/bits"
	"os"
	"sort"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)
	var n int
	if _, err := fmt.Fscan(reader, &n); err != nil {
		return
	}

	adj := make([]int, n)
	for i := 0; i < n; i++ {
		var s string
		fmt.Fscan(reader, &s)
		for j := 0; j < n; j++ {
			if s[j] == '1' {
				adj[i] |= (1 << j)
			}
		}
	}

	dp := make([][]int64, 1<<n)
	dpBacking := make([]int64, (1<<n)*n)
	for i := range dp {
		dp[i] = dpBacking[i*n : (i+1)*n]
	}

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

	for M := 1; M < (1<<n); M++ {
		for u := 0; u < n; u++ {
			if (M & (1 << u)) != 0 {
				if dp[M][u] > 0 {
					allowed := adj[u] & (^M) & ((1 << n) - 1)
					for allowed > 0 {
						v := bits.TrailingZeros(uint(allowed))
						dp[M|(1<<v)][v] += dp[M][u]
						allowed &= allowed - 1
					}
				}
			}
		}
	}

	SW := make([][]int64, n+1)
	swBacking := make([]int64, (n+1)*(1<<n))
	for i := range SW {
		SW[i] = swBacking[i*(1<<n) : (i+1)*(1<<n)]
	}

	for M := 1; M < (1<<n); M++ {
		var sum int64 = 0
		for u := 0; u < n; u++ {
			if (M & (1 << u)) != 0 {
				sum += dp[M][u]
			}
		}
		l := bits.OnesCount(uint(M))
		SW[l][M] = sum
	}

	for l := 1; l <= n; l++ {
		for i := 0; i < n; i++ {
			for M := 0; M < (1<<n); M++ {
				if (M & (1 << i)) != 0 {
					SW[l][M] += SW[l][M^(1<<i)]
				}
			}
		}
	}

	G := make([]int64, 1<<(n-1))
	memo := make(map[string]int64)

	for mask := 0; mask < (1<<(n-1)); mask++ {
		var sizes []int
		current := 1
		for i := 0; i < n-1; i++ {
			if (mask & (1 << i)) != 0 {
				current++
			} else {
				sizes = append(sizes, current)
				current = 1
			}
		}
		sizes = append(sizes, current)

		sort.Ints(sizes)
		var sb strings.Builder
		for _, s := range sizes {
			sb.WriteByte(byte(s))
		}
		key := sb.String()

		if val, ok := memo[key]; ok {
			G[mask] = val
		} else {
			var total int64 = 0
			for S := 0; S < (1<<n); S++ {
				var prod int64 = 1
				for _, sz := range sizes {
					prod *= SW[sz][S]
				}
				if (n-bits.OnesCount(uint(S)))%2 == 1 {
					total -= prod
				} else {
					total += prod
				}
			}
			memo[key] = total
			G[mask] = total
		}
	}

	for i := 0; i < n-1; i++ {
		for mask := 0; mask < (1<<(n-1)); mask++ {
			if (mask & (1 << i)) == 0 {
				G[mask] -= G[mask|(1<<i)]
			}
		}
	}

	out := bufio.NewWriter(os.Stdout)
	for i := 0; i < (1 << (n - 1)); i++ {
		if i > 0 {
			fmt.Fprint(out, " ")
		}
		fmt.Fprint(out, G[i])
	}
	fmt.Fprintln(out)
	out.Flush()
}
```