← Home
package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	data, _ := io.ReadAll(os.Stdin)
	p := 0
	nextUint64 := func() uint64 {
		for p < len(data) && (data[p] < '0' || data[p] > '9') {
			p++
		}
		var v uint64
		for p < len(data) && data[p] >= '0' && data[p] <= '9' {
			v = v*10 + uint64(data[p]-'0')
			p++
		}
		return v
	}

	n := int(nextUint64())
	m := int(nextUint64())
	k := nextUint64()

	a := make([][]uint64, n)
	for i := 0; i < n; i++ {
		a[i] = make([]uint64, m)
		for j := 0; j < m; j++ {
			a[i][j] = nextUint64()
		}
	}

	totalMoves := n + m - 2
	leftMoves := totalMoves / 2
	rightMoves := totalMoves - leftMoves

	mp := make([][]map[uint64]uint64, n)
	for i := 0; i < n; i++ {
		mp[i] = make([]map[uint64]uint64, m)
	}

	var dfs1 func(int, int, int, uint64)
	dfs1 = func(x, y, steps int, xr uint64) {
		xr ^= a[x][y]
		if steps == leftMoves {
			if mp[x][y] == nil {
				mp[x][y] = make(map[uint64]uint64)
			}
			mp[x][y][xr]++
			return
		}
		if x+1 < n {
			dfs1(x+1, y, steps+1, xr)
		}
		if y+1 < m {
			dfs1(x, y+1, steps+1, xr)
		}
	}

	var ans uint64
	var dfs2 func(int, int, int, uint64)
	dfs2 = func(x, y, steps int, xr uint64) {
		xr ^= a[x][y]
		if steps == rightMoves {
			if mp[x][y] != nil {
				ans += mp[x][y][k^xr^a[x][y]]
			}
			return
		}
		if x > 0 {
			dfs2(x-1, y, steps+1, xr)
		}
		if y > 0 {
			dfs2(x, y-1, steps+1, xr)
		}
	}

	dfs1(0, 0, 0, 0)
	dfs2(n-1, m-1, 0, 0)

	fmt.Println(ans)
}