結果
問題 | No.117 組み合わせの数 |
ユーザー | zawakasu |
提出日時 | 2024-03-06 18:10:54 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 340 ms / 5,000 ms |
コード長 | 3,712 bytes |
コンパイル時間 | 1,143 ms |
コンパイル使用メモリ | 107,640 KB |
実行使用メモリ | 50,144 KB |
最終ジャッジ日時 | 2024-09-29 18:31:16 |
合計ジャッジ時間 | 2,045 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ソースコード
#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() : n_{2u}, F_{T{1}, T{1}}, inv_{T{0}, T{1}}, invF_{T{1}, T{1}} {} 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; /* * yukicoder No.117 組み合わせの数 * https://yukicoder.me/submissions/957878 */ 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 }