結果
問題 | No.117 組み合わせの数 |
ユーザー | h_noson |
提出日時 | 2016-06-02 00:25:10 |
言語 | C++11 (gcc 11.4.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,315 bytes |
コンパイル時間 | 769 ms |
コンパイル使用メモリ | 68,240 KB |
実行使用メモリ | 11,300 KB |
最終ジャッジ日時 | 2024-10-08 05:12:45 |
合計ジャッジ時間 | 1,484 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ソースコード
#include <iostream> #include <vector> #include <map> #include <algorithm> using namespace std; #define REP(i,s,e) for (i = s; i <= e; i++) #define rep(i,n) REP (i,0,(int)(n)-1) #define RREP(i,s,e) for (i = s; i >= e; i--) #define rrep(i,n) RREP (i,(int)(n)-1,0) #define INF (int)1e8 #define MOD (int)(1e9+7) typedef long long ll; int frac[2000100]; int inv(ll x) { int n = MOD-2; ll ret = 1; while (n > 0) { if (n % 2) ret *= x, ret %= MOD; x *= x; x %= MOD; n /= 2; } return ret; } int C(int n, int k) { if (n < k) return 0; else return 1LL * frac[n] * inv(frac[k]) % MOD * inv(frac[n-k]) % MOD; } int P(int n, int k) { if (n < k) return 0; else return 1LL * frac[n] * inv(frac[n-k]) % MOD; } int H(int n, int k) { return C(n+k-1,k); } int main(void) { int t; ll i; frac[0] = 1; REP (i,1,2000000) frac[i] = (frac[i-1] * i) % MOD; cin >> t; while (t--) { string s; int n, k; size_t pos; cin >> s; n = stoi(s.substr(2),&pos); k = stoi(s.substr(3+pos)); if (s[0] == 'C') cout << C(n,k) << endl; else if (s[0] == 'P') cout << P(n,k) << endl; else if (s[0] == 'H') cout << H(n,k) << endl; } return 0; }