提出 #70489742


ソースコード 拡げる

#include <bits/stdc++.h>
#ifdef LOCAL
#include <debug.hpp>
#else
#define debug(...) void(0)
#endif

template <class T, class U = T> bool chmin(T& x, U&& y) { return y < x and (x = std::forward<U>(y), true); }

template <class T, class U = T> bool chmax(T& x, U&& y) { return x < y and (x = std::forward<U>(y), true); }

template <class T> void mkuni(std::vector<T>& v) {
    std::ranges::sort(v);
    auto result = std::ranges::unique(v);
    v.erase(result.begin(), result.end());
}

template <class T> int lwb(const std::vector<T>& v, const T& x) {
    return std::distance(v.begin(), std::ranges::lower_bound(v, x));
}

#include <atcoder/convolution>
#include <atcoder/modint>

template <typename T> struct Binomial {
    Binomial(int MAX = 0) : n(1), facs(1, T(1)), finvs(1, T(1)), invs(1, T(1)) {
        assert(T::mod() != 0);
        if (MAX > 0) extend(MAX + 1);
    }

    T fac(int i) {
        assert(i >= 0);
        while (n <= i) extend();
        return facs[i];
    }

    T finv(int i) {
        assert(i >= 0);
        while (n <= i) extend();
        return finvs[i];
    }

    T inv(int i) {
        assert(i >= 0);
        while (n <= i) extend();
        return invs[i];
    }

    T P(int n, int r) {
        if (n < r or r < 0) return 0;
        return fac(n) * finv(n - r);
    }

    T C(int n, int r) {
        if (n < r or r < 0) return 0;
        return fac(n) * finv(n - r) * finv(r);
    }

    T H(int n, int r) {
        if (n < 0 or r < 0) return 0;
        return r == 0 ? 1 : C(n + r - 1, r);
    }

    T negative_binom(int n, int k) { return H(k, n); }

    T C_naive(int n, int r) {
        if (n < r or r < 0) return 0;
        T res = 1;
        r = std::min(r, n - r);
        for (int i = 1; i <= r; i++) res *= inv(i) * (n--);
        return res;
    }

    T catalan(int n) {
        if (n < 0) return 0;
        return fac(2 * n) * finv(n + 1) * finv(n);
    }

    T catalan_pow(int n, int k) {
        if (n < 0 or k < 0) return 0;
        if (k == 0) return n == 0 ? 1 : 0;
        return inv(n + k) * k * C(2 * n + k - 1, n);
    }

    T calatan1(int n, int m) { return C(n + m, m) - C(n + m, m - 1); }

    T catalan2(int n, int m, int k) { return n - m <= -k ? 0 : C(n + m, m) - C(n + m, m - k); }

    T narayana(int n, int k) {
        if (n < k or k <= 0) return 0;
        return C(n, k) * C(n, k - 1) * inv(n);
    }

    T grid_sum(int x, int y) {
        if (x < 0 or y < 0) return 0;
        return C(x + y + 2, x + 1) - 1;
    }

    T grid_sum2(int xl, int xr, int yl, int yr) {
        if (xl >= xr or yl >= yr) return 0;
        xl--, xr--, yl--, yr--;
        return grid_sum(xr, yr) - grid_sum(xl, yr) - grid_sum(xr, yl) + grid_sum(xl, yl);
    }

  private:
    int n;
    std::vector<T> facs, finvs, invs;

    inline void extend(int m = -1) {
        if (m == -1) m = n * 2;
        m = std::min(m, T::mod());
        if (n >= m) return;
        facs.resize(m);
        finvs.resize(m);
        invs.resize(m);
        for (int i = n; i < m; i++) facs[i] = facs[i - 1] * i;
        finvs[m - 1] = T(1) / facs[m - 1];
        invs[m - 1] = finvs[m - 1] * facs[m - 2];
        for (int i = m - 2; i >= n; i--) {
            finvs[i] = finvs[i + 1] * (i + 1);
            invs[i] = finvs[i] * facs[i - 1];
        }
        n = m;
    }
};

using namespace std;

using ll = long long;

using mint = atcoder::modint998244353;
Binomial<mint> BINOM;

mint f(int N, int A, int B, int C, auto coef) {
    vector<mint> a(N + 1, 0), b(N + 1, 0), c(N + 1, 0);
    for (int i = 0; i <= N; i += A) {
        a[i] = coef(i);
    }
    for (int i = 0; i <= N; i += B) {
        b[i] = coef(i);
    }
    for (int i = 0; i <= N; i += C) {
        c[i] = coef(i);
    }
    auto prod = atcoder::convolution(atcoder::convolution(a, b), c);
    return prod[N];
}

void solve() {
    int N, A, B, C;
    cin >> N >> A >> B >> C;
    auto ans1 = f(N, A, B, C, [](int i) { return 1; });
    auto ans2 = f(N, A, B, C, [&](int i) { return BINOM.finv(i); });
    ans2 *= BINOM.fac(N);

    cout << ans1.val() << "\n" << ans2.val() << "\n";
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout << fixed << setprecision(15);

    solve();
    return 0;
}

提出情報

提出日時
問題 G - Balls and Boxes
ユーザ rniya
言語 C++ 23 (gcc 12.2)
得点 575
コード長 4392 Byte
結果 AC
実行時間 209 ms
メモリ 30796 KiB

コンパイルエラー

Main.cpp: In lambda function:
Main.cpp:152:38: warning: unused parameter ‘i’ [-Wunused-parameter]
  152 |     auto ans1 = f(N, A, B, C, [](int i) { return 1; });
      |                                  ~~~~^

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 575 / 575
結果
AC × 4
AC × 32
セット名 テストケース
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt, 01_random_00.txt, 01_random_01.txt, 01_random_02.txt, 01_random_03.txt, 01_random_04.txt, 01_random_05.txt, 01_random_06.txt, 01_random_07.txt, 01_random_08.txt, 01_random_09.txt, 01_random_10.txt, 01_random_11.txt, 02_corner_00.txt, 02_corner_01.txt, 02_corner_02.txt, 02_corner_03.txt, 02_corner_04.txt, 02_corner_05.txt, 02_corner_06.txt, 02_corner_07.txt, 02_corner_08.txt, 02_corner_09.txt, 02_corner_10.txt, 02_corner_11.txt, 02_corner_12.txt, 02_corner_13.txt, 02_corner_14.txt, 02_corner_15.txt
ケース名 結果 実行時間 メモリ
00_sample_00.txt AC 1 ms 3532 KiB
00_sample_01.txt AC 1 ms 3508 KiB
00_sample_02.txt AC 208 ms 30684 KiB
00_sample_03.txt AC 9 ms 4220 KiB
01_random_00.txt AC 156 ms 23284 KiB
01_random_01.txt AC 207 ms 30692 KiB
01_random_02.txt AC 104 ms 16832 KiB
01_random_03.txt AC 206 ms 30692 KiB
01_random_04.txt AC 154 ms 22704 KiB
01_random_05.txt AC 206 ms 30600 KiB
01_random_06.txt AC 104 ms 17216 KiB
01_random_07.txt AC 206 ms 30628 KiB
01_random_08.txt AC 104 ms 16944 KiB
01_random_09.txt AC 206 ms 30600 KiB
01_random_10.txt AC 155 ms 21676 KiB
01_random_11.txt AC 208 ms 30644 KiB
02_corner_00.txt AC 208 ms 30604 KiB
02_corner_01.txt AC 208 ms 30548 KiB
02_corner_02.txt AC 208 ms 30632 KiB
02_corner_03.txt AC 207 ms 30640 KiB
02_corner_04.txt AC 208 ms 30648 KiB
02_corner_05.txt AC 209 ms 30632 KiB
02_corner_06.txt AC 207 ms 30652 KiB
02_corner_07.txt AC 207 ms 30792 KiB
02_corner_08.txt AC 207 ms 30796 KiB
02_corner_09.txt AC 207 ms 30644 KiB
02_corner_10.txt AC 207 ms 27460 KiB
02_corner_11.txt AC 207 ms 27884 KiB
02_corner_12.txt AC 206 ms 23508 KiB
02_corner_13.txt AC 206 ms 23508 KiB
02_corner_14.txt AC 153 ms 21580 KiB
02_corner_15.txt AC 155 ms 23248 KiB