比赛 寒假集训5 评测结果 AAAWWAWWWW
题目名称 на меня 最终得分 40
用户昵称 dbk 运行时间 1.512 s
代码语言 C++ 内存使用 3.88 MiB
提交时间 2026-03-01 10:25:53
显示代码纯文本
#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;
}