#include <iostream>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <cmath>
#include <stack>
#include <string>
#include <queue>
#include <algorithm>
#include <cstdio>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define MOD 1000000007
long long a[100005], b[100005],c[100005], dp[100005];
int n;
long long m;
long long qpow(long long x,long long y) {
long long ans = 1, q = x % MOD;
while (y) {
if (y & 1) {
ans = (ans * q) % MOD;
}
q = (q * q) % MOD;
y >>= 1;
}
return ans;
}
long long makedp(int i) {
if (i == n + 1) {
return 0;
}
if (a[i] == b[i]) {
if (a[i] == 0) {
dp[i] = (dp[i] + ((((m - 1) * m/ 2) % MOD) * c[i + 1]) % MOD) % MOD;
dp[i] = (dp[i] + (m * makedp(i + 1)) % MOD) % MOD;
}
else {
dp[i] = (dp[i] + makedp(i + 1)) % MOD;
}
}
else if (a[i] == 0) {
dp[i] = (dp[i] + ((m - b[i]) * c[i + 1]) % MOD) % MOD;
dp[i] = (dp[i] + makedp(i + 1)) % MOD;
}
else if (b[i] == 0) {
dp[i] = (dp[i] + (((a[i] - 1) * c[i + 1]) % MOD)) % MOD;
dp[i] = (dp[i] + makedp(i + 1)) % MOD;
}
else if (a[i] > b[i]) {
dp[i] = (dp[i] + c[i + 1]) % MOD;
}
return dp[i];
}
long long Gcd(long long x, long long y) {
return y == 0 ? x : Gcd(y, x % y);
}
int main(){
while (~scanf("%d%lld", &n, &m)) {
for (int i = 1; i <= n; ++i) {
scanf("%lld", &a[i]);
}
for (int i = 1; i <= n; ++i) {
scanf("%lld", &b[i]);
}
if (m == 1) {
printf("0\n");
continue;
}
c[n + 1] = 1;
for (int i = n; i>= 1; --i) {
c[i] = c[i + 1];
if (a[i] == 0) {
c[i] = (c[i] * m) % MOD;
}
if(b[i] == 0){
c[i] = (c[i] * m) % MOD;
}
}
long long q = c[1];
long long p = makedp(1);
printf("%lld\n",(qpow(q,MOD - 2) * p) % MOD);
}
return 0;
}
DP,就是求P/Q这个概率,Q好求,Q=m的所有的0的个数次方,P的话用dp[i]表示以第i个为起始字符,A>B的方法数,显然若A[i] > B[i],此情形下,之后的A,B中的0可以任意取,A[i] = B[i],则求dp[i + 1]即可,A[i] < B[i],此情形下方法数为0。