結果
問題 | No.1596 Distance Sum in 2D Plane |
ユーザー |
|
提出日時 | 2021-07-09 22:11:42 |
言語 | Java17 (openjdk 17.0.1) |
結果 |
AC
|
実行時間 | 1,033 ms / 2,000 ms |
コード長 | 1,765 bytes |
コンパイル時間 | 1,744 ms |
使用メモリ | 91,712 KB |
最終ジャッジ日時 | 2023-02-01 23:54:51 |
合計ジャッジ時間 | 16,466 ms |
ジャッジサーバーID (参考情報) |
judge11 / judge14 |
テストケース
テストケース表示入力 | 結果 | 実行時間 使用メモリ |
---|---|---|
testcase_00 | AC | 111 ms
69,392 KB |
testcase_01 | AC | 109 ms
70,144 KB |
testcase_02 | AC | 1,002 ms
89,740 KB |
testcase_03 | AC | 1,033 ms
89,988 KB |
testcase_04 | AC | 1,020 ms
89,448 KB |
testcase_05 | AC | 1,000 ms
90,028 KB |
testcase_06 | AC | 1,011 ms
91,028 KB |
testcase_07 | AC | 1,008 ms
91,712 KB |
testcase_08 | AC | 993 ms
90,176 KB |
testcase_09 | AC | 1,028 ms
89,952 KB |
testcase_10 | AC | 981 ms
89,388 KB |
testcase_11 | AC | 971 ms
90,528 KB |
testcase_12 | AC | 971 ms
89,576 KB |
testcase_13 | AC | 954 ms
91,156 KB |
testcase_14 | AC | 90 ms
51,040 KB |
testcase_15 | AC | 92 ms
51,044 KB |
testcase_16 | AC | 97 ms
50,996 KB |
testcase_17 | AC | 91 ms
51,068 KB |
testcase_18 | AC | 94 ms
51,080 KB |
testcase_19 | AC | 93 ms
50,944 KB |
ソースコード
import java.util.Scanner; public class Main { static long[] frac = null; static final int MOD = 1000000007; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = Integer.parseInt(sc.next()); int M = Integer.parseInt(sc.next()); int[] t = new int[M]; int[] x = new int[M]; int[] y = new int[M]; for ( int i = 0 ; i < M ; i++ ) { t[i] = Integer.parseInt(sc.next()); x[i] = Integer.parseInt(sc.next()); y[i] = Integer.parseInt(sc.next()); } sc.close(); frac = new long[2 * N + 2]; rec(2 * N + 1); long ans = (comb(2 * N, N) * 2 * N) % MOD; for ( int i = 0 ; i < M ; i++ ) { if ( t[i] == 1 ) { long a1 = comb(x[i] + y[i], x[i]); long a2 = comb(2 * N - x[i] - y[i] - 1, N - x[i] - 1); ans = (ans - (a1 * a2) % MOD + MOD) % MOD; } else { long a1 = comb(x[i] + y[i], x[i]); long a2 = comb(2 * N - x[i] - y[i] - 1, N - x[i]); ans = (ans - (a1 * a2) % MOD + MOD) % MOD; } } System.out.println(ans); } static long comb(int n, int a) { long ret = frac[n]; long x = modInv(frac[a], MOD); long y = modInv(frac[n - a], MOD); return (((ret * x) % MOD) * y) % MOD; } static long rec(int a) { if ( a <= 0 ) { frac[a] = 1; return 1; } long x = (((long) a) * ((long)rec(a - 1))) % MOD; frac[a] = x; return x; } static long[] xgcd(long a, long b) { long x0 = 1; long y0 = 0; long x1 = 0; long y1 = 1; while ( b != 0 ) { long q = a / b; long tmp = b; b = a % b; a = tmp; tmp = x1; x1 = x0 - q * x1; x0 = tmp; tmp = y1; y1 = y0 - q * y1; y0 = tmp; } return new long[] {a, x0, y0}; } static long modInv(long a, long p) { long[] xgcd = xgcd(a, p); return (xgcd[1] + p) % p; } }