#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define all(c) ((c).begin()), ((c).end())
#define sz(x) ((int)(x).size())

#ifdef LOCAL
#include <print.h>
#else
#define trace(...)
#define endl "\n" // remove in interactive
#endif

const int N = 33;

int power(int x, int a, int p){
    int ret = 1;
    for(; a; a >>= 1, x = (x * (ll) x) % p) if(a & 1) ret = (ret * (ll) x) % p;
    return ret;
}
pair<ll, int> dp[2][1400000];
int main(){
    ios_base::sync_with_stdio(false); 
    cin.tie(NULL); // Remove in interactive problems
    int n, p;
    cin >> n;
    cin >> p;
    
    vector<int> fact(N * N, 0), invfact(N * N, 0);
    fact[0] = 1;
    for(int i = 1; i < N * N; i++){
        fact[i] = i * (ll) fact[i - 1] % p;
    }
    invfact[N*N - 1] = power(fact[N*N - 1], p - 2, p);
    for(int i = N*N - 2; i >= 0; i--){
        invfact[i] = (i + 1) * (ll) invfact[i + 1] % p;
    }
    assert(invfact[0] == 1);
    vector<int> s(n), t(n);
    ll MASK = 0;
    int delta = 0;
    for(int i = 0; i < n; i++){
        cin >> s[i]; 
        s[i]--;
        delta-=s[i];
    }
    for(int i = 0; i < n; i++){
        cin >> t[i]; 
        t[i]--;
        delta += t[i];
    }
    if(delta<0){
        cout << 0 << endl;
        return 0;
    }
    dp[0][0] = {(1LL << n) - 1, fact[delta]};
    sort(all(s));
    sort(all(t));
    int I[2];
    I[0] = 1;
    function<void(ll, int, int, int)> appendMasks = [&](ll mask, int i, int d, int id){
        if(d > i + 1) return;
        if(d == 0){
            dp[id][I[id]++] = {(1LL << n) - 1 - mask, 0};
            return;
        }
        if(s[i] <= t[d - 1]) appendMasks(mask | (1LL << i), i - 1, d - 1, id);
        appendMasks(mask, i - 1, d, id);
    };

    for(int pos = 0, id = 0; pos < n; pos++, id ^= 1){
        int x = t[pos];
        I[id ^ 1] = 0;
        int maxi = 0;
        while(maxi < n && s[maxi] <= x) maxi++; maxi--;
        appendMasks(0LL, maxi, pos + 1, id ^ 1);
        for(int u = 0; u <= maxi; u++){
            int ptr = 0;
            for(int i = 0; i < I[id]; i++){
                ll mask = dp[id][i].first;
                int value = dp[id][i].second;
                ll newmask = mask & (~(1LL << u));
                if(newmask == mask) continue;
                while(ptr < I[id ^ 1] && dp[id ^ 1][ptr].first < newmask) ptr++;
                if(dp[id ^ 1][ptr].first == newmask) dp[id ^ 1][ptr].second = (dp[id ^ 1][ptr].second + value * (ll) invfact[x - s[u]]) % p;
            }
        }
    }
    cout << dp[n & 1][0].second << endl;
}