結果
問題 | No.584 赤、緑、青の色塗り |
ユーザー | ats5515 |
提出日時 | 2017-10-28 00:20:07 |
言語 | C++11 (gcc 11.4.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,931 bytes |
コンパイル時間 | 657 ms |
コンパイル使用メモリ | 83,204 KB |
実行使用メモリ | 10,496 KB |
最終ジャッジ日時 | 2024-11-22 00:03:17 |
合計ジャッジ時間 | 4,588 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 3 ms
10,496 KB |
testcase_01 | AC | 2 ms
5,248 KB |
testcase_02 | AC | 3 ms
5,248 KB |
testcase_03 | AC | 2 ms
5,248 KB |
testcase_04 | AC | 2 ms
5,248 KB |
testcase_05 | AC | 2 ms
5,248 KB |
testcase_06 | AC | 3 ms
5,248 KB |
testcase_07 | AC | 2 ms
5,248 KB |
testcase_08 | AC | 2 ms
5,248 KB |
testcase_09 | AC | 2 ms
5,248 KB |
testcase_10 | AC | 3 ms
5,248 KB |
testcase_11 | AC | 2 ms
5,248 KB |
testcase_12 | AC | 2 ms
5,248 KB |
testcase_13 | AC | 3 ms
5,248 KB |
testcase_14 | AC | 20 ms
5,248 KB |
testcase_15 | AC | 3 ms
5,248 KB |
testcase_16 | AC | 5 ms
5,248 KB |
testcase_17 | AC | 90 ms
5,248 KB |
testcase_18 | AC | 15 ms
5,248 KB |
testcase_19 | TLE | - |
ソースコード
#include <iostream> #include <vector> #include <map> #include <set> #include <queue> #include <string> #include <iomanip> #include <algorithm> #include <cmath> #include <stdio.h> using namespace std; #define int long long int MOD = 1000000007; template <typename Int, Int MOD, int N> struct comb_util { std::array<Int, N + 1> fc, ifc; comb_util() { fc[0] = 1; for (int i = 1; i <= N; i++) fc[i] = fc[i - 1] * i % MOD; ifc[N] = inv(fc[N]); for (int i = N - 1; i >= 0; i--) ifc[i] = ifc[i + 1] * (i + 1) % MOD; } Int fact(Int n) { return fc[n]; } Int inv_fact(Int n) { return ifc[n]; } Int inv(Int n) { return pow(n, MOD - 2); } Int pow(Int n, Int a) { Int res = 1, exp = n; for (; a; a /= 2) { if (a & 1) res = res * exp % MOD; exp = exp * exp % MOD; } return res; } Int perm(Int n, Int r) { if (r < 0 || n < r) return 0; else return fc[n] * ifc[n - r] % MOD; } Int binom(Int n, Int r) { if (n < 0 || r < 0 || n < r) return 0; return fc[n] * ifc[r] % MOD * ifc[n - r] % MOD; } Int homo(Int n, Int r) { if (n < 0 || r < 0) return 0; return r == 0 ? 1 : binom(n + r - 1, r); } }; using comb = comb_util<long long, 1000000007, 30000>; comb cb; int myhash(int a, int b, int c) { if (a > b) { swap(a, b); } if (b > c) { swap(c, b); } if (a > b) { swap(a, b); } return a * 1000000 + b * 1000 + c; } void unhash(int &a,int &b,int &c,int h) { c = h % 1000; h /= 1000; b = h % 1000; h /= 1000; a = h; } signed main() { cin.tie(0); ios::sync_with_stdio(false); int N, A, B, C; cin >> N >> A >> B >> C; int res = 0; int t; int x1, x2, x3; int tt; if (A + B + C > (3.0*2.0) * (N + 1)) { cout << 0 << endl; return 0; } for (int x = 0; x <= A + B + C; x++) { int y = (A + B + C - x) / 2; if (x + 2 * y == A + B + C) { if (x + 2 * y + x + y <= N + 1) { t = 0; t = cb.homo(x + y + 1, N + 1 - 2 * x - 3 * y); //cerr << x << " " << y<<" " << t << endl; t = (t* cb.pow(2, y)) % MOD; t = (t* cb.binom(x + y, y)) % MOD; for (int a = 0; a <= A; a++) { for (int b = 0; b <= B; b++) { int c = x - a - b; if (c < 0) { break; } if (c <= C) { x1 = (A - a + B - b - C + c) / 2; x2 = (A - a - B + b + C - c) / 2; x3 = (-A + a + B - b + C - c) / 2; if (x1 >= 0 && x2 >= 0 && x3 >= 0) { tt = t; tt = (tt* cb.fact(x)) % MOD; tt = (tt* cb.inv_fact(a)) % MOD; tt = (tt* cb.inv_fact(b)) % MOD; tt = (tt* cb.inv_fact(c)) % MOD; tt = (tt* cb.fact(y)) % MOD; tt = (tt* cb.inv_fact(x1)) % MOD; tt = (tt* cb.inv_fact(x2)) % MOD; tt = (tt* cb.inv_fact(x3)) % MOD; //cerr << a << " " << b << " " << c; //cerr << x1 << " " << x2 << " " << x3; //cerr << tt << endl; //cerr << endl; res = (res + tt) % MOD; } } } } } } } cout << res << endl; }