結果

問題 No.117 組み合わせの数
ユーザー dyktr_06dyktr_06
提出日時 2022-12-10 16:38:41
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 352 ms / 5,000 ms
コード長 1,654 bytes
コンパイル時間 2,406 ms
コンパイル使用メモリ 197,408 KB
実行使用メモリ 50,304 KB
最終ジャッジ日時 2024-04-22 23:59:07
合計ジャッジ時間 3,544 ms
ジャッジサーバーID
(参考情報)
judge4 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 352 ms
50,304 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#define PROBLEM "https://yukicoder.me/problems/no/117"
#include <bits/stdc++.h>
using namespace std;

struct Combination{
    vector<long long> memo, memoinv, inv;
    const long long mod;
    Combination(const int &N, const long long &m) : memo(N + 1), memoinv(N + 1), inv(N + 1), mod(m){
        memo[0] = memo[1] = 1;
        memoinv[0] = memoinv[1] = 1;
        inv[1] = 1;
        for(int i = 2; i <= N; ++i){
            memo[i] = memo[i - 1] * i % mod;
            inv[i] = mod - inv[mod % i] * (m / i) % mod;
            memoinv[i] = memoinv[i - 1] * inv[i] % mod;
        }
    }
    inline long long fact(const long long &n) const {
        return memo[n];
    }
    inline long long factinv(const long long &n) const {
        return memoinv[n];
    }
    inline long long ncr(const long long &n, const long long &r) const {
        if(n < r || r < 0) return 0;
        return (memo[n] * memoinv[r] % mod) * memoinv[n - r] % mod;
    }
    inline long long npr(const long long &n, const long long &r) const {
        if(n < r || r < 0) return 0;
        return (memo[n] % mod) * memoinv[n - r] % mod;
    }
    inline long long nhr(const long long &n, const long long &r) const {
        if(n == 0 && r == 0) return 1;
        return ncr(n + r - 1, r);
    }
};

const long long MOD = 1000000007;

int main(){
    int t; cin >> t;
    Combination comb(2000000, MOD);

    while(t--){
        char s[10];
        int n, k;
        scanf("%1s(%d,%d)", s, &n, &k);
		long long ans = 0;
		if(s[0] == 'C') ans = comb.ncr(n, k);
		else if(s[0] == 'P') ans = comb.npr(n, k);
		else if(s[0] == 'H') ans = comb.nhr(n, k);
		cout << ans << endl;
    }
}
0