Submission #45896262


Source Code Expand

#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <map>
#include <set>
#include <iomanip>
#include <array>
#include <algorithm>
#include <random>
#include <chrono>
#include <assert.h>
#include <cstring>
#include <stack>
 
using namespace std;
 
// #defines
#define mkuni(v) sort(all(v)); v.erase(unique(all(v)), v.end())
#define all(v) v.begin(), v.end()
#define endl '\n'
#define ll long long
#define vint vector<int>
#define vll vector<ll>
#define vvint vector<vector<int>>
#define watch(x) dbg((#x), " : ", (x), '\n')
// #define watch(x) cerr << #x << " : " << (x) << '\n';
 
#ifndef ONLINE_JUDGE
#define DEBUG true
#endif
 
 
// ----------------------------------------------
// print statements
// ----------------------------------------------
template<typename T>
istream& operator>>(istream &in, vector<T> &v) {
    for (auto &x : v) in >> x;
    return in;
}
template<typename T>
ostream& operator<<(ostream &out, vector<T> &v) {
    out << "{";
    for (auto &x : v) out << x << " ";
    out << "}\n";
    return out;
}
template<typename Iterable>
void prnv(const Iterable& iterable, ostream&out = cout) {
    if (iterable.begin() == iterable.end()) {
        out << endl;
        return;
    }
    auto x = iterable.begin();
    out << *x;
    for (++x; x != iterable.end(); ++x) out << ' ' << *x;
    out << endl;
}
void prn(char en = '\n') {
    cout << en;
}
template<typename T, typename... Args>
void prn(T x, Args... args) {
    cout << x << " ";
    prn(args...);
}
void dbg() {
    cerr << endl;
}
#ifdef DEBUG
template<typename T, typename... Args>
void dbg(T x, Args... args) {
    cerr << x << " ";
    dbg(args...);
}
#else
template<typename T, typename... Args>
void dbg(T x, Args... args) {}
#endif
 
// ----------------------------------------------
 
/* ----------------------------------------------
 * Juvenile shortcuts
 * ---------------------------------------------- */
template<typename T> void setmin(T &a) {}
template<typename T, typename... Args> void setmin(T &a, T b, Args... args) {a = (a > b ? b : a); setmin(a, args...);}
template<typename T> void setmax(T &a) {}
template<typename T, typename... Args> void setmax(T &a, T b, Args... args) {a = (a < b ? b : a); setmax(a, args...);}
// ----------------------------------------------
 
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define rand(l, r) uniform_int_distribution<ll>(l, r)(rng)
 
// const int MOD = (int)1e9 + 7;
const int MOD = 998244353;
const int oo = (int)1e9;
const int N = 17;
const int M = (int)1e5 + 5;

const int TSZ = (int)1e7;

// #define DEBUG false

ll dp[1<<N], ways[1<<N], diffcnt[1<<N], rcnt[1<<N], r[N], b[N], fac[M+5], invfac[M+5];

ll powermod(ll a, ll b) {
    if (b == 0) return 1;
    ll res = powermod(a, b>>1);
    res = (res * res) % MOD;
    if (b & 1) {
        res = (res * a) % MOD;
    }
    return res;
}

void solve() {

    int n, m;
    cin >> n >> m;

    for (int i=0;i<m;++i) {
        int x;
        cin >> x; --x;
        r[x]++;
    }

    for (int i=0;i<m;++i) {
        int x;
        cin >> x; --x;
        b[x]++;
    }

    fac[0] = 1;
    for (int i=1;i<M+5;++i) {
        fac[i] = (fac[i-1] * i) % MOD;
    }
    invfac[M+4] = powermod(fac[M+4], MOD-2);
    for (int i=M+3;i>=0;--i) {
        invfac[i] = (invfac[i + 1] * (i + 1)) % MOD;
    }

    dp[0] = 0;
    ways[0] = 1;
    rcnt[0] = 0;
    for (int mask=1;mask<(1<<n);++mask) {
        int i;
        for (int j=0;j<n;++j) if (mask & (1<<j)) {
            i = j;
            diffcnt[mask] = diffcnt[mask^(1<<j)] + r[j] - b[j];
            rcnt[mask] = rcnt[mask^(1<<j)] + r[j];
            break; 
        }
        int sz = rcnt[mask];

        if (diffcnt[mask] == 0) ways[mask] = fac[rcnt[mask]];
        else continue;

        for (int m=(mask-1);m>0;m=(m-1)&mask) {
            if ((m & (1<<i)) && diffcnt[m] == 0) {   
                int msz = rcnt[m];

                // prn("adding ", m, " to ", mask, " got ", dp[m], dp[mask^m]);

                ways[mask] -= (ways[m] * fac[sz-msz]) % MOD;
                if (ways[mask] < 0) ways[mask] += MOD;

                ll partways = (ways[m] * fac[sz - msz]) % MOD;
                dp[mask] += ((1 + dp[mask^m]) * partways) % MOD;
                if (dp[mask] >= MOD) dp[mask] -= MOD;
            }   
        }
        // prn(dp[mask], mask, " got last");
        dp[mask] += ways[mask];
        if (dp[mask] >= MOD) dp[mask] -= MOD;
        // prn(dp[mask], mask, " got last");
        dp[mask] = (dp[mask] * invfac[sz]) % MOD;
    }

    // for (int i=0;i<(1<<n);++i) prn(ways[i], " at mask = " , i);

    prn(dp[(1<<n)-1]);
}
 
int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    cout << fixed << setprecision(10);
    int T = 1;
    // cin >> T;
    while (T--) {
        solve();
    }
    return 0;
}

Submission Info

Submission Time
Task G - Electric Circuit
User srikkanthr
Language C++ 23 (Clang 16.0.6)
Score 600
Code Size 5040 Byte
Status AC
Exec Time 526 ms
Memory 9320 KiB

Compile Error

./Main.cpp:79:12: warning: unused parameter 'x' [-Wunused-parameter]
void dbg(T x, Args... args) {}
           ^
./Main.cpp:79:23: warning: unused parameter 'args' [-Wunused-parameter]
void dbg(T x, Args... args) {}
                      ^
./Main.cpp:87:37: warning: unused parameter 'a' [-Wunused-parameter]
template<typename T> void setmin(T &a) {}
                                    ^
./Main.cpp:89:37: warning: unused parameter 'a' [-Wunused-parameter]
template<typename T> void setmax(T &a) {}
                                    ^
./Main.cpp:98:11: warning: unused variable 'oo' [-Wunused-const-variable]
const int oo = (int)1e9;
          ^
./Main.cpp:102:11: warning: unused variable 'TSZ' [-Wunused-const-variable]
const int TSZ = (int)1e7;
          ^
6 warnings generated.

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status
AC × 3
AC × 35
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_m_small_00.txt, 01_m_small_01.txt, 01_m_small_02.txt, 01_m_small_03.txt, 01_m_small_04.txt, 02_m_large_00.txt, 02_m_large_01.txt, 02_m_large_02.txt, 02_m_large_03.txt, 02_m_large_04.txt, 02_m_large_05.txt, 02_m_large_06.txt, 02_m_large_07.txt, 02_m_large_08.txt, 02_m_large_09.txt, 02_m_large_10.txt, 02_m_large_11.txt, 02_m_large_12.txt, 02_m_large_13.txt, 02_m_large_14.txt, 02_m_large_15.txt, 02_m_large_16.txt, 02_m_large_17.txt, 02_m_large_18.txt, 02_m_large_19.txt, 02_m_large_20.txt, 02_m_large_21.txt, 03_bipartite_00.txt, 03_bipartite_01.txt, 03_bipartite_02.txt, 03_bipartite_03.txt, 03_bipartite_04.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 2 ms 5124 KiB
00_sample_01.txt AC 486 ms 9320 KiB
00_sample_02.txt AC 2 ms 5048 KiB
01_m_small_00.txt AC 60 ms 7100 KiB
01_m_small_01.txt AC 25 ms 7156 KiB
01_m_small_02.txt AC 24 ms 7016 KiB
01_m_small_03.txt AC 2 ms 5216 KiB
01_m_small_04.txt AC 188 ms 9196 KiB
02_m_large_00.txt AC 526 ms 9216 KiB
02_m_large_01.txt AC 520 ms 9300 KiB
02_m_large_02.txt AC 13 ms 9192 KiB
02_m_large_03.txt AC 14 ms 9084 KiB
02_m_large_04.txt AC 12 ms 9132 KiB
02_m_large_05.txt AC 12 ms 9260 KiB
02_m_large_06.txt AC 11 ms 8840 KiB
02_m_large_07.txt AC 12 ms 8804 KiB
02_m_large_08.txt AC 11 ms 8936 KiB
02_m_large_09.txt AC 11 ms 9172 KiB
02_m_large_10.txt AC 11 ms 8888 KiB
02_m_large_11.txt AC 12 ms 8916 KiB
02_m_large_12.txt AC 11 ms 8132 KiB
02_m_large_13.txt AC 11 ms 8520 KiB
02_m_large_14.txt AC 11 ms 8512 KiB
02_m_large_15.txt AC 10 ms 8196 KiB
02_m_large_16.txt AC 11 ms 8380 KiB
02_m_large_17.txt AC 11 ms 8812 KiB
02_m_large_18.txt AC 11 ms 8504 KiB
02_m_large_19.txt AC 11 ms 8284 KiB
02_m_large_20.txt AC 11 ms 8488 KiB
02_m_large_21.txt AC 11 ms 7944 KiB
03_bipartite_00.txt AC 9 ms 7168 KiB
03_bipartite_01.txt AC 9 ms 7280 KiB
03_bipartite_02.txt AC 10 ms 7108 KiB
03_bipartite_03.txt AC 9 ms 7152 KiB
03_bipartite_04.txt AC 9 ms 7092 KiB