#include <iostream>
#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;
const int MOD = 1000000007;
const int Mmax = 4004, Nmax = 4004;
// using static array instead of vector to decrease the running time
int Ri[Mmax][Nmax], Do[Mmax][Nmax], A[Mmax], B[Nmax];
ll res[Mmax][Nmax];
int main()
{
if (fopen("JUMP.INP", "r")) {
freopen("JUMP.INP", "r", stdin);
freopen("JUMP.OUT", "w", stdout);
}
ios_base::sync_with_stdio(false); cin.tie(NULL);
int m, n, k;
// using scanf() instead of cin to decrease the running time
scanf("%d %d %d", &m, &n, &k);
for (int i = 1; i <= m; ++i) {
scanf("%d", &A[i]);
A[i] %= k; // we take modulo of A[i] first for later purpose
}
for (int i = 1; i <= n; ++i) {
scanf("%d", &B[i]);
B[i] %= k; // we take modulo of B[i] first for later purpose
}
res[m][n] = Ri[m][n] = Do[m][n] = 1;
for (int i = m; i > 0; --i) {
for (int j = n; j > 0; --j) {
int val = A[i] + B[j];
if (val >= k) val -= k; // calculate (A[i] + B[j]) % k avoid using mod '%'
res[i][j] += Ri[i][j + 1] - Ri[i][min(j + 2 + val, n + 1)] + MOD;
res[i][j] += Do[i + 1][j] - Do[min(i + 2 + val, m + 1)][j] + MOD;
while (res[i][j] >= MOD) res[i][j] -= MOD; // calculate res[i][j] % MOD avoid using mod '%'
Ri[i][j] = Ri[i][j + 1] + res[i][j];
Do[i][j] = Do[i + 1][j] + res[i][j];
if (Ri[i][j] >= MOD) Ri[i][j] -= MOD; // calculate Ri[i][j] % MOD avoid using mod '%'
if (Do[i][j] >= MOD) Do[i][j] -= MOD; // calculate Do[i][j] % MOD avoid using mod '%'
}
}
cout << res[1][1];
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojZGVmaW5lIGxsIGxvbmcgbG9uZwoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY29uc3QgaW50IE1PRCA9IDEwMDAwMDAwMDc7CmNvbnN0IGludCBNbWF4ID0gNDAwNCwgTm1heCA9IDQwMDQ7Ci8vIHVzaW5nIHN0YXRpYyBhcnJheSBpbnN0ZWFkIG9mIHZlY3RvciB0byBkZWNyZWFzZSB0aGUgcnVubmluZyB0aW1lCmludCBSaVtNbWF4XVtObWF4XSwgRG9bTW1heF1bTm1heF0sIEFbTW1heF0sIEJbTm1heF07CmxsIHJlc1tNbWF4XVtObWF4XTsKCmludCBtYWluKCkKewogICAgaWYgKGZvcGVuKCJKVU1QLklOUCIsICJyIikpIHsKICAgICAgICBmcmVvcGVuKCJKVU1QLklOUCIsICJyIiwgc3RkaW4pOwogICAgICAgIGZyZW9wZW4oIkpVTVAuT1VUIiwgInciLCBzdGRvdXQpOwogICAgfQogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IGNpbi50aWUoTlVMTCk7CiAgICBpbnQgbSwgbiwgazsKICAgIC8vIHVzaW5nIHNjYW5mKCkgaW5zdGVhZCBvZiBjaW4gdG8gZGVjcmVhc2UgdGhlIHJ1bm5pbmcgdGltZQogICAgc2NhbmYoIiVkICVkICVkIiwgJm0sICZuLCAmayk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtOyArK2kpIHsKICAgICAgICBzY2FuZigiJWQiLCAmQVtpXSk7CiAgICAgICAgQVtpXSAlPSBrOyAvLyB3ZSB0YWtlIG1vZHVsbyBvZiBBW2ldIGZpcnN0IGZvciBsYXRlciBwdXJwb3NlCiAgICB9CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyArK2kpIHsKICAgICAgICBzY2FuZigiJWQiLCAmQltpXSk7CiAgICAgICAgQltpXSAlPSBrOyAvLyB3ZSB0YWtlIG1vZHVsbyBvZiBCW2ldIGZpcnN0IGZvciBsYXRlciBwdXJwb3NlCiAgICB9CiAgICByZXNbbV1bbl0gPSBSaVttXVtuXSA9IERvW21dW25dID0gMTsKICAgIGZvciAoaW50IGkgPSBtOyBpID4gMDsgLS1pKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IG47IGogPiAwOyAtLWopIHsKICAgICAgICAgICAgaW50IHZhbCA9IEFbaV0gKyBCW2pdOwogICAgICAgICAgICBpZiAodmFsID49IGspIHZhbCAtPSBrOyAvLyBjYWxjdWxhdGUgKEFbaV0gKyBCW2pdKSAlIGsgYXZvaWQgdXNpbmcgbW9kICclJwogICAgICAgICAgICByZXNbaV1bal0gKz0gUmlbaV1baiArIDFdIC0gUmlbaV1bbWluKGogKyAyICsgdmFsLCBuICsgMSldICsgTU9EOwogICAgICAgICAgICByZXNbaV1bal0gKz0gRG9baSArIDFdW2pdIC0gRG9bbWluKGkgKyAyICsgdmFsLCBtICsgMSldW2pdICsgTU9EOwogICAgICAgICAgICB3aGlsZSAocmVzW2ldW2pdID49IE1PRCkgcmVzW2ldW2pdIC09IE1PRDsgLy8gY2FsY3VsYXRlIHJlc1tpXVtqXSAlIE1PRCBhdm9pZCB1c2luZyBtb2QgJyUnCiAgICAgICAgICAgIFJpW2ldW2pdID0gUmlbaV1baiArIDFdICsgcmVzW2ldW2pdOwogICAgICAgICAgICBEb1tpXVtqXSA9IERvW2kgKyAxXVtqXSArIHJlc1tpXVtqXTsKICAgICAgICAgICAgaWYgKFJpW2ldW2pdID49IE1PRCkgUmlbaV1bal0gLT0gTU9EOyAvLyBjYWxjdWxhdGUgUmlbaV1bal0gJSBNT0QgYXZvaWQgdXNpbmcgbW9kICclJwogICAgICAgICAgICBpZiAoRG9baV1bal0gPj0gTU9EKSBEb1tpXVtqXSAtPSBNT0Q7IC8vIGNhbGN1bGF0ZSBEb1tpXVtqXSAlIE1PRCBhdm9pZCB1c2luZyBtb2QgJyUnCiAgICAgICAgfQogICAgfQogICAgY291dCA8PCByZXNbMV1bMV07CiAgICByZXR1cm4gMDsKfQ==