結果
問題 | No.389 ロジックパズルの組み合わせ |
ユーザー |
|
提出日時 | 2016-07-09 11:50:31 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 68 ms / 2,000 ms |
コード長 | 1,348 bytes |
コンパイル時間 | 607 ms |
コンパイル使用メモリ | 74,020 KB |
実行使用メモリ | 6,960 KB |
最終ジャッジ日時 | 2024-10-13 09:30:34 |
合計ジャッジ時間 | 5,274 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 99 |
ソースコード
#include <iostream> #include <cstdio> #include <vector> #include <algorithm> #include <utility> using namespace std; const int MOD = 1e9 + 7; int main() { int m, x; cin >> m; vector<int> h(m); int blocks = 0; int total = 0; while (cin >> x) { total += x; blocks++; } int rest = m - total - (blocks - 1); // printf("%d %d %d\n", rest, blocks, total); if (rest < 0) { cout << "NA" << endl; return 0; } else if (total == 0) { cout << 1 << endl; return 0; } //(blocks + rest)C(rest) // printf("%dC%d\n", blocks + rest, rest); long long ans = 1; for (int i = blocks + rest; i > 1; i--) { ans = ans * i % MOD; } long long denominator = 1; for (int i = blocks; i > 1; i--) { denominator = denominator * i % MOD; } for (int i = rest; i > 1; i--) { denominator = denominator * i % MOD; } vector<long long> pows(31, 0); pows[0] = denominator; for (int i = 1; i < pows.size(); i++) { pows[i] = pows[i - 1] * pows[i - 1] % MOD; } int p2 = MOD - 2; long long inv_denom = 1; for (int i = 30; i >= 0; i--) { if ((p2 >> i) & 1) { inv_denom = inv_denom * pows[i] % MOD; // printf("inv %2d %10lld\n", i, inv_denom); } } // printf("ans %lld\n", ans); // printf("denom %lld\n", denominator); // printf("inv %lld\n", inv_denom); ans = ans * inv_denom % MOD; cout << ans << endl; return 0; }