Skip to content

Commit 7325479

Browse files
committed
Giant Chess board
1 parent 01c4eb7 commit 7325479

File tree

1 file changed

+86
-0
lines changed

1 file changed

+86
-0
lines changed
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package main.java.videos;
2+
3+
import main.java.InputReader;
4+
5+
import java.math.BigInteger;
6+
import java.util.Arrays;
7+
8+
public class GiantChessBoard {
9+
private static long mod = (long) (1e9 + 7);
10+
private static long[] fact = generateFactorials(1000000);
11+
private static long[] invFact = generateReverseFactorials(1000000);
12+
13+
public static void main(final String[] args) {
14+
final InputReader in = new InputReader(System.in);
15+
final int n = in.readInt();
16+
final int m = in.readInt();
17+
final int k = in.readInt();
18+
final Point point[] = new Point[k];
19+
for (int i = 0; i < k; i++) {
20+
point[i] = new Point(in.readInt(), in.readInt());
21+
}
22+
Arrays.sort(point);
23+
final int[] x = new int[k + 1];
24+
final int[] y = new int[k + 1];
25+
for (int i = 0; i < k; i++) {
26+
x[i] = point[i].x;
27+
y[i] = point[i].y;
28+
}
29+
x[k] = n;
30+
y[k] = m;
31+
final long[] dp = new long[k + 1];
32+
for (int i = 0; i <= k; i++) {
33+
dp[i] = comb(x[i] - 1, x[i] - 1 + y[i] - 1);
34+
for (int j = 0; j < i; j++) {
35+
if (y[j] <= y[i]) {
36+
dp[i] -= dp[j] * comb(x[i] - x[j], x[i] - x[j] + y[i] - y[j]) % mod;
37+
}
38+
}
39+
dp[i] = ((dp[i] % mod) + mod) % mod;
40+
}
41+
long result = dp[k];
42+
System.out.println(result);
43+
}
44+
45+
private static long comb(final int m, final int n) {
46+
return (((fact[n] * invFact[m]) % mod) * invFact[n - m]) % mod;
47+
}
48+
49+
public static long[] generateFactorials(int count) {
50+
long[] result = new long[count];
51+
result[0] = 1;
52+
for (int i = 1; i < count; i++) {
53+
result[i] = (result[i - 1] * i) % mod;
54+
}
55+
return result;
56+
}
57+
58+
public static long[] generateReverseFactorials(int upTo) {
59+
final long[] reverseFactorials = new long[upTo];
60+
reverseFactorials[0] = reverseFactorials[1] = 1;
61+
final BigInteger BIG_MOD = BigInteger.valueOf(mod);
62+
for (int i = 1; i < upTo; i++) {
63+
reverseFactorials[i] = (BigInteger.valueOf(i).modInverse(BIG_MOD).longValue() * reverseFactorials[i - 1]) % mod;
64+
}
65+
return reverseFactorials;
66+
}
67+
}
68+
69+
class Point implements Comparable<Point> {
70+
final int x, y;
71+
72+
Point(final int x, final int y) {
73+
this.x = x;
74+
this.y = y;
75+
}
76+
77+
@Override
78+
public int compareTo(final Point other) {
79+
if (x < other.x) {
80+
return -1;
81+
} else if (x > other.x) {
82+
return 1;
83+
}
84+
return this.y - other.y;
85+
}
86+
}

0 commit comments

Comments
 (0)