結果

問題 No.117 組み合わせの数
ユーザー zawakasuzawakasu
提出日時 2024-03-06 17:59:43
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 387 ms / 5,000 ms
コード長 3,565 bytes
コンパイル時間 1,321 ms
コンパイル使用メモリ 107,104 KB
実行使用メモリ 50,192 KB
最終ジャッジ日時 2024-09-29 18:31:45
合計ジャッジ時間 2,386 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

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

ソースコード

diff #

#line 1 "117.cpp"
#define PROBLEM "https://onlinejudge.u-aizu.ac.jp/courses/lesson/2/ITP1/1/ITP1_1_A"

#line 2 "/home/zawatin/compro/cp-documentation/Src/Template/IOSetting.hpp"

#line 2 "/home/zawatin/compro/cp-documentation/Src/Template/TypeAlias.hpp"

#include <cstdint>
#include <cstddef>

namespace zawa {

using i16 = std::int16_t;
using i32 = std::int32_t;
using i64 = std::int64_t;
using i128 = __int128_t;

using u8 = std::uint8_t;
using u16 = std::uint16_t;
using u32 = std::uint32_t;
using u64 = std::uint64_t;

using usize = std::size_t;

} // namespace zawa
#line 4 "/home/zawatin/compro/cp-documentation/Src/Template/IOSetting.hpp"

#include <iostream>
#include <iomanip>

namespace zawa {

void SetFastIO() {
    std::cin.tie(nullptr)->sync_with_stdio(false);
}

void SetPrecision(u32 dig) {
    std::cout << std::fixed << std::setprecision(dig);
}

} // namespace zawa
#line 2 "/home/zawatin/compro/cp-documentation/Src/Number/BinomalCoefficients.hpp"

#line 4 "/home/zawatin/compro/cp-documentation/Src/Number/BinomalCoefficients.hpp"

#include <cassert>
#include <cmath>
#include <vector>

namespace zawa {

template <class T>
class BinomalCoefficients {
public:
    static constexpr u64 MOD{T::mod()};
private:
    usize n_{};
    std::vector<T> F_{}, inv_{}, invF_{};
    constexpr bool need(usize n) const noexcept {
        return n_ <= n;
    }
    void expand(usize n) {
        F_.reserve(n + 1);
        inv_.reserve(n + 1);
        invF_.reserve(n + 1);
        for (usize i{n_} ; i <= n ; i++) {
            F_.emplace_back(F_.back() * T{i});
            inv_.emplace_back(MOD - inv_[MOD % i] * (MOD / i));
            invF_.emplace_back(invF_.back() * inv_.back());
        }
        n_ = n + 1;
    }
public:
    constexpr usize size() const noexcept {
        return n_;
    }
    BinomalCoefficients() = default;
    BinomalCoefficients(usize n) : n_{2u}, F_{T{1}, T{1}}, inv_{T{0}, T{1}}, invF_{T{1}, T{1}} {
        assert(n);
        if (need(n)) expand(n);
    }
    T F(i32 n) {
        if (need(std::abs(n))) expand(static_cast<usize>(std::abs(n)));
        return (n >= 0 ? F_[n] : invF_[-n]);
    }
    T P(i32 p, i32 q) {
        if (q > p) return T{}; 
        return F(p) * F(q - p);
    }
    T C(i32 p, i32 q) {
        if (q > p) return T{};
        return P(p, q) * F(-q);
    }
    T H(i32 p, i32 q) {
        if (p == 0 and q == 0) return T{1};
        return C(p + q - 1, q);
    }
    T B(const std::vector<i32>& b) {
        T res{1};
        i32 sum{};
        for (i32 x : b) {
            res *= F(-x);
            sum += x;
        }
        res *= F(sum);
        return res;
    }
};

} // namespace zawa
#line 5 "117.cpp"

#line 7 "117.cpp"
#include <tuple>
#include <atcoder/modint>
using mint = atcoder::modint1000000007;
using namespace zawa;

std::tuple<char, int, int> parse() {
    std::string s; std::cin >> s;
    char c{s[0]};
    int i{2};
    int p{};
    for (; s[i] != ',' ; i++) {
        p = (p * 10) + (s[i] - '0');
    }
    int q{};
    for (i++ ; s[i] != ')' ; i++) {
        q = (q * 10) + (s[i] - '0');
    }
    return { c, p, q };
}

void solve() {
    int t; std::cin >> t;
    BinomalCoefficients<mint> comb(1000000);
    for (int _{} ; _ < t ; _++) {
        auto [c, p, q]{parse()}; 
        if (c == 'C') std::cout << comb.C(p, q).val() << '\n';
        else if (c == 'P') std::cout << comb.P(p, q).val() << '\n';
        else std::cout << comb.H(p, q).val() << '\n';
    }
}

int main() {
#ifdef ONLINE_JUDGE
    solve();
#else
    std::cout << "Hello World" << '\n';
#endif
}
0