結果
問題 | No.117 組み合わせの数 |
ユーザー | Ryu |
提出日時 | 2018-06-07 17:41:34 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
RE
|
実行時間 | - |
コード長 | 1,438 bytes |
コンパイル時間 | 699 ms |
コンパイル使用メモリ | 77,596 KB |
実行使用メモリ | 21,120 KB |
最終ジャッジ日時 | 2024-06-30 10:32:50 |
合計ジャッジ時間 | 2,448 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ソースコード
#include <iostream> #include <vector> #include <cmath> #define FOR(i,a,b) for(int i=(a);i<(b);++i) using namespace std; typedef long long ll; const ll M = pow(10,9)+7; vector<ll> fac(1000001); //n!(mod M) vector<ll> ifac(1000001); //k!^{M-2} (mod M) ll mpow(ll x, ll n){ //x^n(mod M) ll ans = 1; while(n != 0){ if(n&1) ans = ans*x % M; x = x*x % M; n = n >> 1; } return ans; } ll comb(ll a, ll b){ //aCb(mod M) if(a == 0 && b == 0)return 1; if(a < b || a < 0)return 0; ll tmp = ifac[a-b]* ifac[b] % M; return tmp * fac[a] % M; } ll perm(ll a, ll b){ if(a < b) return 0; ll tmp = ifac[a-b] % M; return tmp * fac[a] % M; } ll dupc(ll a,ll b){ if(a == 0 && b == 0)return 1; if(a < 0 || b == 0)return 0; ll tmp = ifac[a-1]* ifac[b] % M; return tmp * fac[a+b-1] % M; } int main() { ll t; cin >> t; vector<char> c(t); vector<int> a(t),b(t); FOR(i, 0, t){ scanf(" %c(%d,%d)",&c[i] ,&a[i] ,&b[i]); } fac[0] = 1; ifac[0] = 1; for(ll i = 0; i<1000000; i++){ fac[i+1] = fac[i]*(i+1) % M; // n!(mod M) ifac[i+1] = ifac[i]*mpow(i+1, M-2) % M; // k!^{M-2} (mod M) } FOR(i, 0, t){ ll ans=0; if(c[i] == 'P')ans = perm(a[i],b[i]); if(c[i] == 'C')ans = comb(a[i],b[i]); if(c[i] == 'H')ans = dupc(a[i],b[i]); cout << ans << endl; } return 0; }