結果
問題 | No.117 組み合わせの数 |
ユーザー | 東前頭十一枚目 |
提出日時 | 2019-07-10 19:40:51 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 825 ms / 5,000 ms |
コード長 | 1,517 bytes |
コンパイル時間 | 1,921 ms |
コンパイル使用メモリ | 170,748 KB |
実行使用メモリ | 120,448 KB |
最終ジャッジ日時 | 2024-10-15 20:19:59 |
合計ジャッジ時間 | 3,852 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
コンパイルメッセージ
main.cpp: In function 'int main()': main.cpp:44:16: warning: 'k' may be used uninitialized [-Wmaybe-uninitialized] 44 | int n, k, tmp = 0; | ^ main.cpp:44:13: warning: 'n' may be used uninitialized [-Wmaybe-uninitialized] 44 | int n, k, tmp = 0; | ^
ソースコード
#include <bits/stdc++.h> using namespace std; using fint64 = int_fast64_t; struct Combination { const int MAX = 5000010; const int MOD; vector<fint64> FAC; vector<fint64> INV; vector<fint64> FAC_INV; Combination(fint64 MOD) : MOD(MOD), FAC(vector<fint64>(MAX)), INV(vector<fint64>(MAX)), FAC_INV(vector<fint64>(MAX)) { FAC[0] = INV[1] = FAC_INV[0] = 1; for(int i = 1; i < MAX; ++i) { FAC[i] = FAC[i - 1] * i % MOD; if(i > 1) INV[i] = MOD - INV[MOD % i] * (MOD / i) % MOD; FAC_INV[i] = FAC_INV[i - 1] * INV[i] % MOD; } } fint64 C(int n, int r) { if(n < 0 or r < 0 or n < r) return 0; return FAC[n] * FAC_INV[r] % MOD * FAC_INV[n - r] % MOD; } fint64 P(int n, int r) { if(n < 0 or r < 0 or n < r) return 0; return FAC[n] * FAC_INV[n - r] % MOD; } fint64 H(int n, int r) { if(r == 0) return 1; return C(n + r - 1, r); } }; int main() { const int MOD=1e9 + 7; Combination com(MOD); int t; cin >> t; while(t--) { string s; cin >> s; int n, k, tmp = 0; for(int i = 2; i < (int)s.size(); ++i) { if(s[i] == ')') { k = tmp; } else if(s[i] == ',') { n = tmp; tmp = 0; } else { tmp *= 10; tmp += s[i] - '0'; } } if(s[0] == 'C') cout << com.C(n, k) << '\n'; if(s[0] == 'P') cout << com.P(n, k) << '\n'; if(s[0] == 'H') cout << com.H(n, k) << '\n'; } return 0; }