提出 #61346087


ソースコード 拡げる

#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for (int i=(int)(a);i<(int)(b);i++)
#define all(p) p.begin(),p.end()

#include <atcoder/modint>
using mint = atcoder::modint1000000007;

namespace po167{
    template<class T>
    struct Binomial{
        std::vector<T> fact_vec, fact_inv_vec;
        void extend(int m = -1){
            int n = fact_vec.size();
            if (m == -1) m = n * 2;
            if (n >= m) return;
            fact_vec.resize(m);
            fact_inv_vec.resize(m);
            for (int i = n; i < m; i++){
                fact_vec[i] = fact_vec[i - 1] * T(i);
            }
            fact_inv_vec[m - 1] = T(1) / fact_vec[m - 1];
            for (int i = m - 1; i > n; i--){
                fact_inv_vec[i - 1] = fact_inv_vec[i] * T(i);
            }
        }
        Binomial(int MAX = 0){
            fact_vec.resize(1, T(1));
            fact_inv_vec.resize(1, T(1));
            extend(MAX + 1);
        }
        T fact(int i){
            if (i < 0) return 0;
            return fact_vec[i];
        }
        T invfact(int i){
            if (i < 0) return 0;
            return fact_inv_vec[i];
        }
        T C(int a, int b){
            if (a < b || b < 0) return 0;
            return fact(a) * invfact(b) * invfact(a - b);
        }
    };
}
// CITRUS CURIO CITY / FREDERIC
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N, M;
    cin >> N >> M;
    vector<int> A(M);
    rep(i, 0, M) cin >> A[i];
    vector<mint> dp(1 << N);
    dp[0] = 1;
    po167::Binomial<mint> table(1 << N);
    reverse(all(A));
    for (auto x : A){
        auto n_dp = dp;
        rep(i, 0, 1 << N) rep(j, 0, N){
            if (i & (1 << j)) continue;
            mint tmp = dp[i];
            tmp *= table.C((1 << N) - x - i, (1 << j) - 1);
            tmp *= table.fact(1 << j);
            n_dp[i + (1 << j)] -= tmp;
        }
        swap(n_dp, dp);
    }
    mint ans = 0;
    rep(i, 0, 1 << N) ans += dp[i] * table.fact((1 << N) - 1 - i);
    ans *= (1 << N);
    cout << ans.val() << "\n";
}

提出情報

提出日時
問題 F - Dark Horse
ユーザ potato167
言語 C++ 17 (gcc 12.2)
得点 1100
コード長 2151 Byte
結果 AC
実行時間 87 ms
メモリ 4380 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 1100 / 1100
結果
AC × 5
AC × 41
セット名 テストケース
Sample sample-01.txt, sample-02.txt, sample-03.txt, sample-04.txt, sample-05.txt
All 01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, 21.txt, 22.txt, 23.txt, 24.txt, 25.txt, 26.txt, 27.txt, 28.txt, 29.txt, 30.txt, 31.txt, 32.txt, 33.txt, 34.txt, 35.txt, 36.txt, sample-01.txt, sample-02.txt, sample-03.txt, sample-04.txt, sample-05.txt
ケース名 結果 実行時間 メモリ
01.txt AC 8 ms 3568 KiB
02.txt AC 72 ms 4296 KiB
03.txt AC 76 ms 4256 KiB
04.txt AC 79 ms 4288 KiB
05.txt AC 51 ms 4228 KiB
06.txt AC 61 ms 4252 KiB
07.txt AC 72 ms 4380 KiB
08.txt AC 80 ms 4252 KiB
09.txt AC 83 ms 4228 KiB
10.txt AC 80 ms 4244 KiB
11.txt AC 2 ms 3864 KiB
12.txt AC 8 ms 4096 KiB
13.txt AC 17 ms 4288 KiB
14.txt AC 25 ms 4228 KiB
15.txt AC 1 ms 3412 KiB
16.txt AC 1 ms 3420 KiB
17.txt AC 1 ms 3440 KiB
18.txt AC 1 ms 3416 KiB
19.txt AC 1 ms 3484 KiB
20.txt AC 1 ms 3528 KiB
21.txt AC 86 ms 4252 KiB
22.txt AC 82 ms 4220 KiB
23.txt AC 77 ms 4288 KiB
24.txt AC 72 ms 4124 KiB
25.txt AC 55 ms 4276 KiB
26.txt AC 29 ms 4156 KiB
27.txt AC 1 ms 3468 KiB
28.txt AC 1 ms 3488 KiB
29.txt AC 1 ms 3604 KiB
30.txt AC 1 ms 3468 KiB
31.txt AC 1 ms 3480 KiB
32.txt AC 87 ms 4304 KiB
33.txt AC 1 ms 3412 KiB
34.txt AC 1 ms 3480 KiB
35.txt AC 1 ms 3324 KiB
36.txt AC 1 ms 3480 KiB
sample-01.txt AC 1 ms 3528 KiB
sample-02.txt AC 1 ms 3488 KiB
sample-03.txt AC 1 ms 3520 KiB
sample-04.txt AC 1 ms 3400 KiB
sample-05.txt AC 86 ms 4156 KiB