```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)
}
```