Pagini recente » Cod sursa (job #3031334) | Cod sursa (job #3147954) | Monitorul de evaluare | Cod sursa (job #1976390) | Cod sursa (job #2739123)
#include <bits/stdc++.h>
using namespace std;
const int CMAX = 1e3;
const int NMAX = 1e6;
const int MOD = 2e6 + 3;
class Point {
public:
int x, y;
Point() = default;
Point(int x, int y):
x(x), y(y) {};
bool operator < (const Point& other) const {
if (this->x != other.x)
return this->x < other.x;
return this->y < other.y;
}
};
int c;
Point points[1 + CMAX + 1];
int64_t dp[1 + CMAX + 1];
int64_t fact[1 + 2 * NMAX];
int64_t log_pow(int base, int exp) {
int64_t ans = 1;
int64_t temp = base;
while (exp) {
if (exp & 1)
ans = (ans * temp) % MOD;
exp >>= 1;
temp = (temp * temp) % MOD;
}
return ans;
}
void factorial() {
fact[0] = 1;
for (int i = 1; i <= 2 * NMAX; ++i)
fact[i] = (fact[i - 1] * i) % MOD;
}
inline int64_t inv(int64_t base) {
return log_pow(base, MOD - 2);
}
inline int64_t comb(int n, int k) {
int64_t prod = (fact[k] * fact[n - k]) % MOD;
return (fact[n] * inv(prod)) % MOD;
}
int main() {
std::ifstream in("padure2.in");
std::ofstream out("padure2.out");
factorial();
int n, m;
in >> n >> m >> c;
for (int i = 1; i <= c; ++i)
in >> points[i].x >> points[i].y;
points[++c] = Point(n, m);
std::sort(points + 1, points + 1 + c);
for (int i = 1; i <= c; ++i) {
dp[i] = comb(points[i].x + points[i].y - 2, points[i].x - 1);
for (int j = 1; j < i; ++j) {
if (points[j].y <= points[i].y)
dp[i] = (dp[i] - dp[j] * comb(points[i].x - points[j].x + points[i].y - points[j].y, points[i].x - points[j].x) % MOD + MOD) % MOD;
}
}
out << dp[c];
return 0;
}