제출 #1334443

#제출 시각아이디문제언어결과실행 시간메모리
1334443dead0neAmusement Park (CEOI19_amusementpark)C++20
0 / 100
0 ms344 KiB
#include <bits/stdc++.h>
#define int long long
#define ii pair<int, int>
#define st first
#define nd second
#define vi vector<int>
#define pb push_back
#define spc << " " <<
#define MX 300005
#define MOD 998244353
#define inf 1e15
using namespace std;

int dp[(1<<19)-1];
int add(int x, int y){
    if(x+y>=MOD) return x+y-MOD;
    return x+y;
}

int mult(int x, int y){
    return (x*y)%MOD;
}

void solve(){
    int fact[19];
    fact[0]=1;
    for(int i=1; i<=18; i++) fact[i]=mult(fact[i-1],i);
    int n,m; cin >> n >> m;
    bitset<18> edg[n];
    for(int i=1; i<=m; i++){
        int a,b; cin >> a >> b; a--; b--;
        edg[a].set(b);
    }
    dp[0]=0;
    for(int mask=1; mask<(1<<n); mask++){
        dp[mask]=0;
        int cnt=__builtin_popcount(mask);
        bitset<18> bm;
        bm=mask;
        for(int i=0; i<18; i++){
            if(!((1<<i)&mask)) continue;
            dp[mask]=add(dp[mask], add(dp[mask^(1<<i)], mult(fact[cnt-1], (edg[i]&bm).count())));
        }
    }
    cout << dp[(1<<n)-1] << endl;
}

signed main(){
    ios_base::sync_with_stdio(false); cin.tie(0);
    #ifdef Local
    freopen("in", "r", stdin);
    freopen("out", "w", stdout);
    #endif
    solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...