#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 8e5 + 20;
int n, p;
int a[5010], b[5010];
int fact[N], infact[N];
int ans = 0;
int qpow(int a, int k, int p) {
int res = 1 % p;
a %= p;
while (k) {
if (k & 1) res = res * a % p;
a = a * a % p;
k >>= 1;
}
return res;
}
void init(int max_n, int p) {
fact[0] = 1;
for (int i = 1; i <= max_n; i++) {
fact[i] = fact[i - 1] * i % p;
}
infact[max_n] = qpow(fact[max_n], p - 2, p);
for (int i = max_n - 1; i >= 0; i--) {
infact[i] = infact[i + 1] * (i + 1) % p;
}
}
int C(int n, int k) {
if (k < 0 || k > n) return 0;
return fact[n] * infact[k] % p * infact[n - k] % p;
}
signed main() {
freopen("BBQ.in", "r", stdin);
freopen("BBQ.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> p;
int max_c = 0;
for (int i = 1; i <= n; i++) {
cin >> a[i] >> b[i];
max_c = max(max_c, a[i] + b[i]);
}
init(2 * max_c, p);
ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
ans = (ans + C(a[i] + a[j] + b[i] + b[j], a[i] + a[j])) % p;
}
}
cout << ans << endl;
return 0;
}