結果
問題 |
No.1596 Distance Sum in 2D Plane
|
ユーザー |
![]() |
提出日時 | 2025-08-15 22:07:39 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 78 ms / 2,000 ms |
コード長 | 2,467 bytes |
コンパイル時間 | 3,014 ms |
コンパイル使用メモリ | 281,292 KB |
実行使用メモリ | 7,716 KB |
最終ジャッジ日時 | 2025-08-15 22:07:58 |
合計ジャッジ時間 | 5,036 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 17 |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; bool chmin(auto &a, auto b) { return a > b ? a = b, true : false; } bool chmax(auto &a, auto b) { return a < b ? a = b, true : false; } #include <atcoder/modint> using mint = atcoder::modint1000000007; namespace combination { template<typename mint> struct C { static vector<mint> fac, finv; static void init(int n) { int sz = fac.size(); if (n < sz) return; n = clamp(n, 2 * sz, min(1 << 25, mint::mod() - 1)); fac.resize(n + 1); finv.resize(n + 1); for (int i = sz; i <= n; i++) { fac[i] = i * fac[i - 1]; } finv[n] = fac[n].inv(); for (int i = n; i >= sz; i--) { finv[i - 1] = i * finv[i]; } } }; template<typename mint> vector<mint> C<mint>::fac(1, 1); template<typename mint> vector<mint> C<mint>::finv(1, 1); template<typename mint> mint fac(int n) { C<mint>::init(n); if (n < 0) return 0; return C<mint>::fac[n]; } template<typename mint> mint finv(int n) { C<mint>::init(n); if (n < 0) return 0; return C<mint>::finv[n]; } template<typename mint> mint mod_inv(int n) { assert(n > 0); return finv<mint>(n) * fac<mint>(n - 1); } template<typename mint> mint nCk(int n, int k) { if (n < 0 || n < k || k < 0) return 0; return fac<mint>(n) * finv<mint>(n - k) * finv<mint>(k); } template<typename mint> mint multi_C(const vector<int> &v) { int n = 0; for (const int &k : v) n += k; mint res = fac<mint>(n); for (const int &k : v) res *= finv<mint>(k); return res; } template<typename mint> mint nPk(int n, int k) { if (n < 0 || n < k || k < 0) return 0; return fac<mint>(n) * finv<mint>(n - k); } template<typename mint> mint catalan(int n) { return fac<mint>(2 * n) * finv<mint>(n) * finv<mint>(n + 1); } template<typename mint> mint grid_path(int n, int m) { return nCk<mint>(n + m, n); } } // namespace combination using namespace combination; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, M; cin >> N >> M; mint ans = 2 * N * grid_path<mint>(N, N); for (int t, r, c; M--; ) { cin >> t >> r >> c; if (t == 1) { ans -= grid_path<mint>(r, c) * grid_path<mint>(N - r - 1, N - c); } else { ans -= grid_path<mint>(r, c) * grid_path<mint>(N - r, N - c - 1); } } cout << ans.val() << endl; }