提出 #69691455


ソースコード 拡げる

#include <bits/stdc++.h>
#include <atcoder/modint>
using namespace std;
using u32 = uint32_t;
using namespace atcoder;

vector<u32> primes; // M の素因数
struct Modint {
    modint x; // M と互いに素な部分
    array<int, 9> pc; // pc[i] := primes[i] が何個掛けられているか?
    Modint() {}
    Modint(u32 a): pc{} {
        assert(a > 0);
        for (u32 i = 0; i < size(primes); i++) {
            const u32 p = primes[i];
            while (a % p == 0) {
                a /= p;
                pc[i]++;
            }
        }
        x = a;
    }
    Modint& operator*=(const Modint& rhs) {
        x *= rhs.x;
        for (u32 i = 0; i < size(primes); i++) {
            pc[i] += rhs.pc[i];
        }
        return *this;
    }
    friend Modint operator*(const Modint& lhs, const Modint& rhs) {
        return Modint(lhs) *= rhs;
    }
    Modint inv() const {
        Modint res = *this;
        res.x = x.inv();
        for (int& c : res.pc) c = -c;
        return res;
    }
    u32 val() const {
        auto v = x;
        for (u32 i = 0; i < size(primes); i++) {
            const modint p = primes[i];
            int c = pc[i];
            assert(c >= 0);
            while (c--) {
                auto v2 = v * p;
                if (v == v2) break;
                v = v2;
            }
        }
        return v.val();
    }
};
constexpr u32 MAX = 5000;
Modint fac[MAX + 1], inv[MAX + 1];
int main(){
    cin.tie(0)->sync_with_stdio(0);
    
    u32 T, M;
    cin >> T >> M;
    modint::set_mod(M);
    
    // primes := (M の素因数) を計算
    for (u32 p = 2; p * p <= M; p++) {
        if (M % p == 0) {
            primes.push_back(p);
            do M /= p;
            while (M % p == 0);
        }
    }
    if (M > 1) primes.push_back(M);
    
    // 階乗前計算
    fac[0] = 1;
    for (u32 i = 1; i <= MAX; i++) fac[i] = fac[i - 1] * Modint(i);
    inv[MAX] = fac[MAX].inv();
    for (u32 i = MAX; i >= 1; i--) inv[i - 1] = inv[i] * Modint(i);
    
    // 答えの計算
    while (T--) {
        u32 N;
        cin >> N;
        Modint ans = 1;
        u32 sumC = 0;
        while (N--) {
            u32 C;
            cin >> C;
            ans *= inv[C];
            sumC += C;
        }
        ans *= fac[sumC];
        cout << ans.val() << '\n';
    }
}

提出情報

提出日時
問題 E - Count Sequences 2
ユーザ tatyam
言語 C++ 23 (gcc 12.2)
得点 450
コード長 2420 Byte
結果 AC
実行時間 36 ms
メモリ 4044 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 450 / 450
結果
AC × 2
AC × 51
セット名 テストケース
Sample 00_sample_00.txt, 00_sample_01.txt
All 00_sample_00.txt, 00_sample_01.txt, 01_test_00.txt, 01_test_01.txt, 01_test_02.txt, 01_test_03.txt, 01_test_04.txt, 01_test_05.txt, 01_test_06.txt, 01_test_07.txt, 01_test_08.txt, 01_test_09.txt, 01_test_10.txt, 01_test_11.txt, 01_test_12.txt, 01_test_13.txt, 01_test_14.txt, 01_test_15.txt, 01_test_16.txt, 01_test_17.txt, 01_test_18.txt, 01_test_19.txt, 01_test_20.txt, 01_test_21.txt, 01_test_22.txt, 01_test_23.txt, 01_test_24.txt, 01_test_25.txt, 01_test_26.txt, 01_test_27.txt, 01_test_28.txt, 01_test_29.txt, 01_test_30.txt, 01_test_31.txt, 01_test_32.txt, 01_test_33.txt, 01_test_34.txt, 01_test_35.txt, 01_test_36.txt, 01_test_37.txt, 01_test_38.txt, 01_test_39.txt, 01_test_40.txt, 01_test_41.txt, 01_test_42.txt, 01_test_43.txt, 01_test_44.txt, 01_test_45.txt, 01_test_46.txt, 01_test_47.txt, 01_test_48.txt
ケース名 結果 実行時間 メモリ
00_sample_00.txt AC 1 ms 3812 KiB
00_sample_01.txt AC 1 ms 3904 KiB
01_test_00.txt AC 9 ms 3916 KiB
01_test_01.txt AC 13 ms 3916 KiB
01_test_02.txt AC 17 ms 4044 KiB
01_test_03.txt AC 9 ms 4040 KiB
01_test_04.txt AC 13 ms 4004 KiB
01_test_05.txt AC 18 ms 3916 KiB
01_test_06.txt AC 11 ms 3832 KiB
01_test_07.txt AC 18 ms 3908 KiB
01_test_08.txt AC 21 ms 3840 KiB
01_test_09.txt AC 9 ms 3812 KiB
01_test_10.txt AC 15 ms 3920 KiB
01_test_11.txt AC 19 ms 3852 KiB
01_test_12.txt AC 9 ms 3876 KiB
01_test_13.txt AC 14 ms 3820 KiB
01_test_14.txt AC 20 ms 3880 KiB
01_test_15.txt AC 9 ms 3852 KiB
01_test_16.txt AC 13 ms 3904 KiB
01_test_17.txt AC 19 ms 3904 KiB
01_test_18.txt AC 9 ms 3916 KiB
01_test_19.txt AC 14 ms 3920 KiB
01_test_20.txt AC 19 ms 3920 KiB
01_test_21.txt AC 10 ms 3880 KiB
01_test_22.txt AC 16 ms 4004 KiB
01_test_23.txt AC 20 ms 4004 KiB
01_test_24.txt AC 10 ms 3912 KiB
01_test_25.txt AC 16 ms 3852 KiB
01_test_26.txt AC 20 ms 3816 KiB
01_test_27.txt AC 14 ms 3912 KiB
01_test_28.txt AC 29 ms 3836 KiB
01_test_29.txt AC 26 ms 3820 KiB
01_test_30.txt AC 10 ms 4036 KiB
01_test_31.txt AC 17 ms 3892 KiB
01_test_32.txt AC 20 ms 3820 KiB
01_test_33.txt AC 9 ms 3976 KiB
01_test_34.txt AC 14 ms 3912 KiB
01_test_35.txt AC 19 ms 4004 KiB
01_test_36.txt AC 9 ms 3912 KiB
01_test_37.txt AC 13 ms 3908 KiB
01_test_38.txt AC 17 ms 3916 KiB
01_test_39.txt AC 10 ms 3792 KiB
01_test_40.txt AC 16 ms 3920 KiB
01_test_41.txt AC 20 ms 3912 KiB
01_test_42.txt AC 11 ms 3852 KiB
01_test_43.txt AC 19 ms 3916 KiB
01_test_44.txt AC 21 ms 3908 KiB
01_test_45.txt AC 10 ms 3820 KiB
01_test_46.txt AC 16 ms 3908 KiB
01_test_47.txt AC 20 ms 3920 KiB
01_test_48.txt AC 36 ms 3908 KiB