爆 0 求助
查看原帖
爆 0 求助
726139
残阳如血楼主2024/7/28 10:52

rt.

#include <bits/stdc++.h>
using lint = long long;
const int N = 1e5 + 10;

lint fact[N];
int T, n, m, p;

void init() {
  fact[0] = 1;
  for (int i = 1; i <= n + m; ++i)
    fact[i] = fact[i - 1] * i % p;
}

lint qpow(lint a, lint b) {
  a %= p;
  lint res = 1 % p;
  for (; b; b >>= 1) {
    if (b & 1) (res *= a) %= p;
    (a *= a) %= p;
  }
  return res;
}

lint inv(lint x) {
  return qpow(x, p - 2);
}

lint C(lint n, lint m) {
  if (m > n) return 0;
  return fact[n] * inv(n - m) % p * inv(m) % p;
}

lint Lucas(lint n, lint m) {
  if (!m) return 1;
  return C(n % p, m % p) * Lucas(n / p, m / p) % p;
}

int main() {
  for (std::cin >> T; T; --T) {
    std::cin >> n >> m >> p;
    init();
    std::cout << Lucas(n + m, n) << std::endl;
  }
  return 0;
}
2024/7/28 10:52
加载中...