← Home
```go
package main

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

const MOD = 1000000007

func power(a, b int64) int64 {
	res := int64(1)
	a %= MOD
	for b > 0 {
		if b&1 == 1 {
			res = (res * a) % MOD
		}
		a = (a * a) % MOD
		b >>= 1
	}
	return res
}

func modInverse(n int64) int64 {
	return power(n, MOD-2)
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)

	readInt := func() int64 {
		scanner.Scan()
		val, _ := strconv.ParseInt(scanner.Text(), 10, 64)
		return val
	}

	if !scanner.Scan() {
		return
	}
	n, _ := strconv.ParseInt(scanner.Text(), 10, 64)
	m := readInt()

	a := make([]int64, n)
	for i := int64(0); i < n; i++ {
		a[i] = readInt()
	}

	b := make([]int64, n)
	for i := int64(0); i < n; i++ {
		b[i] = readInt()
	}

	invM := modInverse(m)
	inv2M := (modInverse(2) * invM) % MOD

	ans := int64(0)
	probEq := int64(1)

	for i := int64(0); i < n; i++ {
		u := a[i]
		v := b[i]
		var pG, pE int64

		if u == 0 && v == 0 {
			pG = ((m - 1) * inv2M) % MOD
			pE = invM
		} else if u == 0 {
			pG = ((m - v) * invM) % MOD
			pE = invM
		} else if v == 0 {
			pG = ((u - 1) * invM) % MOD
			pE = invM
		} else {
			if u > v {
				pG = 1
			} else {
				pG = 0
			}
			if u == v {
				pE = 1
			} else {
				pE = 0
			}
		}

		term := (probEq * pG) % MOD
		ans = (ans + term) % MOD
		probEq = (probEq * pE) % MOD

		if probEq == 0 {
			break
		}
	}

	fmt.Println(ans)
}
```