Submission #1096565

#TimeUsernameProblemLanguageResultExecution timeMemory
1096565alexander707070Amusement Park (CEOI19_amusementpark)C++14
42 / 100
3041 ms596 KiB
#include<bits/stdc++.h>
#define MAXN 600007
using namespace std;

const int mod=998244353;

struct polynom{
    int coef[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

    inline friend polynom operator - (polynom fr,polynom sc){
        for(int i=0;i<20;i++)fr.coef[i]-=sc.coef[i];
        return fr;
    }
}chromatic;

struct graph{
    bool e[20][20];  
}g;

int n,m,a[4000],b[4000];
long long ans;

graph combine(graph g,int u,int v){

    for(int i=1;i<=n;i++){
        if(i==v)continue;

        if(g.e[v][i]){
            g.e[v][i]=false;
            g.e[i][v]=false;

            g.e[u][i]=true;
            g.e[i][u]=true;
        }
    }
    g.e[v][v]=false;

    return g;
}

polynom build(graph g){

    for(int i=1;i<=n;i++){
        for(int f=i+1;f<=n;f++){
            if(!g.e[i][f])continue;

            g.e[i][f]=g.e[f][i]=false;
            return build(g) - build(combine(g,i,f));
        }
    }

    int br=0;
    for(int i=1;i<=n;i++){
        if(g.e[i][i])br++;
    }


    polynom curr;
    curr.coef[br]++;
    return curr;
}

int main(){

    cin>>n>>m;
    
    for(int i=1;i<=n;i++)g.e[i][i]=true;

    for(int i=1;i<=m;i++){
        cin>>a[i]>>b[i];

        g.e[a[i]][b[i]]=true;
        g.e[b[i]][a[i]]=true;
    }

    chromatic=build(g);

    for(int i=19;i>=0;i--){
        if(i%2==0)ans+=chromatic.coef[i];
        else ans-=chromatic.coef[i];
    }

    ans=abs(ans);
    ans*=m; ans/=2; ans%=mod;

    cout<<ans<<"\n";

    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...