제출 #1348700

#제출 시각아이디문제언어결과실행 시간메모리
1348700I_FloPPed21Amusement Park (CEOI19_amusementpark)C++20
0 / 100
0 ms344 KiB
#include <bits/stdc++.h>
using namespace std;
const int N=18;
using ll=long long;
const ll mod=998244353;
ll dp[1<<N];
ll fact[N];
int n,m;
struct graf {
    int a,tip;
};
vector<graf>adj[N+1];
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    fact[0]=1;
    for (int i=1;i<=n;i++) {
        fact[i]=(fact[i-1]*i)%mod;
    }
    for (int i=1;i<=m;i++) {
        int a,b;
        cin>>a>>b;
        adj[a].push_back({b,0});
        adj[b].push_back({a,1});
    }


    for (int mask=1;mask<(1<<n);mask++) {

        if (__builtin_popcount((mask))==1)
            continue;
        vector<ll>cost(n+1,0);

        for (int bit=0;bit<n;bit++) {
            if (!(mask&(1<<bit)))
                continue;
            for (auto [u,k]:adj[bit+1]) {
                cost[u]+=k;
            }
        }
        for (int bit=0;bit<n;bit++) {

            if (mask&(1<<bit)) {
                ll val=__builtin_popcount((mask^(1<<bit)));
                ll modes=fact[val];

                /*if (mask==(1<<n)-1&&bit==0) {
                    cout<<cost[bit+1]<<" "<<"huh"<<" "<<modes<<" "<<val<<" "<<mask<<endl;
                }*/
                dp[mask]=(dp[mask]+dp[mask^(1<<bit)]+modes*cost[bit+1]%mod)%mod;
            }
        }
    }
    cout<<dp[(1<<n)-1];
    return 0;
}
#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...