結果
問題 | No.117 組み合わせの数 |
ユーザー | y61mpnl |
提出日時 | 2021-06-13 17:12:19 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 163 ms / 5,000 ms |
コード長 | 968 bytes |
コンパイル時間 | 352 ms |
コンパイル使用メモリ | 50,944 KB |
実行使用メモリ | 49,664 KB |
最終ジャッジ日時 | 2024-06-02 09:37:40 |
合計ジャッジ時間 | 1,082 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ソースコード
#include<cstdio> #include<cstdint> #include<vector> const int MOD = 1e9 + 7; template<typename Int> struct Combination { std::vector<Int> fac, inv, finv; Combination(int n=1e6): fac(n), inv(n), finv(n) { fac[0] = fac[1] = inv[1] = finv[0] = finv[1] = 1; for(Int i=2; i<n; i++){ fac[i] = fac[i-1] * i % MOD; inv[i] = (-MOD/i + MOD) * inv[MOD%i] % MOD; finv[i] = finv[i-1] * inv[i] % MOD; } } Int C(Int n, Int k){ if(n==k || k==0) return 1; if(n<0 || k<0 || n<k) return 0; return fac[n] * finv[k] % MOD * finv[n-k] % MOD; } Int P(Int n, Int k){ return C(n, k) * fac[k] % MOD; } Int H(Int n, Int k){ return C(n+k-1, k); } }; int main(){ int t; scanf("%d", &t); Combination<int64_t> com(2e6); while(t--){ getchar(); char c = getchar(); int n, k; scanf("(%d,%d)", &n, &k); if(c=='C') printf("%ld\n", com.C(n, k)); if(c=='P') printf("%ld\n", com.P(n, k)); if(c=='H') printf("%ld\n", com.H(n, k)); } return 0; }