Submission #35019

#TimeUsernameProblemLanguageResultExecution timeMemory
35019ztrong마스코트 (JOI13_mascots)C++14
100 / 100
173 ms213816 KiB
#include <bits/stdc++.h> using namespace std; #define llint long long void openFile() { ios_base :: sync_with_stdio(false); cin.tie(NULL); #ifdef Tr___ freopen("test.inp", "r", stdin); freopen("test.out", "w", stdout); #else //freopen("name.inp", "r", stdin); //freopen("name.out", "w", stdout); #endif } const int maxN = 3e3 + 5; const int maxM = 1e6 + 5; const llint INF = 1e9 + 7; int N, R, C; int xmin = INF, xmax = -INF, ymin = INF, ymax = -INF; llint dp[maxN][maxN], gt[maxN * maxN], cc[maxN][maxN]; void enter() { cin >> R >> C; cin >> N; for (int i = 1; i <= N; ++i) { int x, y; cin >> x >> y; xmin = min(xmin, x); xmax = max(xmax, x); ymin = min(ymin, y); ymax = max(ymax, y); } } llint pw(int x, int n) { if (n == 0) return 1; if (n == 1) return x % INF; llint res = pw(x, n / 2); res = res * res % INF; if (n & 1) res = res * x % INF; return res; } inline llint getC(int x, int n) { if (x == 0) return 1; if (x == n) return 1; //n! / (x! * (n - x)!) return gt[n] * pw(gt[x], (INF - 2)) % INF * pw(gt[n - x], (INF - 2)) % INF; } void solve() { gt[0] = 1; for (int i = 1; i <= R * C; ++i) { gt[i] = gt[i - 1] * i % INF; } int r = xmax - xmin + 1, c = ymax - ymin + 1; dp[r][c] = gt[r * c - N]; for (int i = r; i <= R; ++i) { for (int j = c; j <= C; ++j) { //cout << i << " " << j << endl; dp[i + 1][j] = (dp[i + 1][j] + dp[i][j] * gt[j]) % INF; dp[i][j + 1] = (dp[i][j + 1] + dp[i][j] * gt[i]) % INF; } } llint res = dp[R][C]; //cout << res << endl; res = res * getC(xmin - 1, R - xmax + xmin - 1) % INF; //cout << res << endl; res = res * getC(ymin - 1, C - ymax + ymin - 1) % INF; cout << res << endl; } int main() { openFile(); enter(); solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...