Submission #374883

#TimeUsernameProblemLanguageResultExecution timeMemory
374883ngpin04마스코트 (JOI13_mascots)C++14
100 / 100
381 ms107884 KiB
#include <bits/stdc++.h> using namespace std; const int N = 3e3 + 5; const int mod = 1e9 + 7; int fac[N * N]; int inv[N * N]; int dp[N][N]; int n,m,k; int comb(int k, int n) { return (long long) fac[n] * inv[k] % mod * inv[n - k] % mod; } int binpow(int n, int k) { int res = 1; for (; k; k >>= 1, n = (long long) n * n % mod) if (k & 1) res = (long long) res * n % mod; return res; } void add(int &a, int b) { a += b; if (a >= mod) a -= mod; } int solve(int i, int j) { int &res = dp[i][j]; if (res != -1) return res; if (i == n && j == m) return 1; res = 0; if (i < n) add(res, (long long) solve(i + 1, j) * fac[j] % mod); if (j < m) add(res, (long long) solve(i, j + 1) * fac[i] % mod); return res; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); //freopen("file.inp","r",stdin); cin >> n >> m >> k; fac[0] = 1; for (int i = 1; i < N * N; i++) fac[i] = (long long) fac[i - 1] * i % mod; inv[N * N - 1] = binpow(fac[N * N - 1], mod - 2); for (int i = N * N - 2; i >= 0; i--) inv[i] = (long long) inv[i + 1] * (i + 1) % mod; int x = 1e9, y = 1e9; int u = 0, v = 0; for (int i = 1; i <= k; i++) { int a,b; cin >> a >> b; x = min(x, a); y = min(y, b); u = max(u, a); v = max(v, b); } int lenx = (u - x + 1); int leny = (v - y + 1); int ans = fac[lenx * leny - k]; memset(dp, -1, sizeof(dp)); ans = (long long) ans * solve(lenx, leny) % mod; x--; u = (n - u); y--; v = (m - v); ans = (long long) ans * comb(x, x + u) % mod * comb(y, y + v) % mod; cout << ans; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...