結果
問題 | No.117 組み合わせの数 |
ユーザー | y61mpnl |
提出日時 | 2021-06-13 17:05:51 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
RE
|
実行時間 | - |
コード長 | 997 bytes |
コンパイル時間 | 331 ms |
コンパイル使用メモリ | 50,944 KB |
実行使用メモリ | 27,648 KB |
最終ジャッジ日時 | 2024-06-02 09:32:11 |
合計ジャッジ時間 | 2,168 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 * inv[MOD%i] % MOD; inv[i] = (inv[i] + MOD) % 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(1e6+10); 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; }