結果
問題 | No.1683 Robot Guidance |
ユーザー |
👑 |
提出日時 | 2021-08-15 13:27:13 |
言語 | C (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 37 ms / 2,000 ms |
コード長 | 1,597 bytes |
コンパイル時間 | 266 ms |
コンパイル使用メモリ | 31,360 KB |
実行使用メモリ | 33,024 KB |
最終ジャッジ日時 | 2024-06-29 19:27:38 |
合計ジャッジ時間 | 1,682 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 38 |
ソースコード
#include <stdio.h>#include <stdlib.h>const int Mod = 1000000007;long long fact[2000001], fact_inv[2000001];long long div_mod(long long x, long long y, long long z){if (x % y == 0) return x / y;else return (div_mod((1 + x / y) * y - x, (z % y), y) * z + x) / y;}long long combination(int n, int k){return fact[n] * fact_inv[k] % Mod * fact_inv[n-k] % Mod;}int main(){int A, B, X, Y;scanf("%d %d %d %d", &A, &B, &X, &Y);if (abs(X + Y) % 2 != A % 2 || abs(X) + abs(Y) > A) {printf("0\n");fflush(stdout);return 0;}if (B == 0) {if (X == A && Y == 0) printf("1\n");else printf("0\n");fflush(stdout);return 0;} else if (B == 1) {if (X >= 0 && Y >= 0 && X + Y == A) printf("1\n");else printf("0\n");fflush(stdout);return 0;} else if (B == 2) {if (Y >= 0) printf("1\n");else printf("0\n");fflush(stdout);return 0;}int i;for (i = 1, fact[0] = 1; i <= A + B; i++) fact[i] = fact[i-1] * i % Mod;for (i = A + B - 1, fact_inv[A+B] = div_mod(1, fact[A+B], Mod); i >= 0; i--) fact_inv[i] = fact_inv[i+1] * (i + 1) % Mod;int r, l, u, d, sur = (A - abs(X) - abs(Y)) / 2;long long ans = 0;for (i = 0; i <= sur; i++) {if (X >= 0) {r = X + i;l = i;} else {r = i;l = -X + i;}if (Y >= 0) {u = Y + sur - i;d = sur - i;} else {u = sur - i;d = -Y + sur - i;}ans += combination(r + B / 4, r) * combination(u + (B - 1) / 4, u) % Mod * combination(l + (B - 2) / 4, l) % Mod * combination(d + (B - 3) / 4, d) % Mod;}printf("%lld\n", ans % Mod);fflush(stdout);return 0;}