← Home
package main

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

var (
	n, m  int
	k     uint64
	a     [][]uint64
	half  int
	ans   uint64
	pref  [][]map[uint64]uint64
)

func dfs1(i, j, d int, x uint64) {
	if d == half {
		if pref[i][j] == nil {
			pref[i][j] = make(map[uint64]uint64)
		}
		pref[i][j][x]++
		return
	}
	if i+1 < n {
		dfs1(i+1, j, d+1, x^a[i+1][j])
	}
	if j+1 < m {
		dfs1(i, j+1, d+1, x^a[i][j+1])
	}
}

func dfs2(i, j, d int, xr uint64) {
	totalSteps := (n-1) + (m-1)
	if d == totalSteps-half {
		if pref[i][j] != nil {
			want := k ^ xr
			if cnt, ok := pref[i][j][want]; ok {
				ans += cnt
			}
		}
		return
	}
	if i > 0 {
		dfs2(i-1, j, d+1, xr^a[i][j])
	}
	if j > 0 {
		dfs2(i, j-1, d+1, xr^a[i][j])
	}
}

func main() {
	in := bufio.NewReader(os.Stdin)
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	if _, err := fmt.Fscan(in, &n, &m, &k); err != nil {
		return
	}
	a = make([][]uint64, n)
	for i := 0; i < n; i++ {
		a[i] = make([]uint64, m)
		for j := 0; j < m; j++ {
			fmt.Fscan(in, &a[i][j])
		}
	}

	half = ((n - 1) + (m - 1)) / 2
	pref = make([][]map[uint64]uint64, n)
	for i := 0; i < n; i++ {
		pref[i] = make([]map[uint64]uint64, m)
	}

	dfs1(0, 0, 0, a[0][0])
	dfs2(n-1, m-1, 0, 0)

	fmt.Fprintln(out, ans)
}