This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#define fast ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
    #include <bits/stdc++.h>
    using namespace std;
    #define sqr 340
    #define mp make_pair
    #define mid (l+r)/2
    #define le node * 2 
    #define ri node * 2 + 1 
    #define pb push_back
    #define ppb pop_back
    #define fi first
    #define se second
    #define lb lower_bound
    #define ub upper_bound
    #define ins insert
    #define era erase
    #define C continue
    #define mem(dp,i) memset(dp,i,sizeof(dp))
    #define mset multiset
    #define all(x) x.begin(), x.end()
    #define gc getchar_unlocked
    typedef long long ll;
    typedef short int si;
    typedef long double ld;
    typedef pair<int,int> pi;
    typedef pair<ll,ll> pll;
    typedef vector<int> vi;
    typedef vector<ll> vll;
    typedef vector<pi> vpi;
    typedef vector<pll> vpll;
    typedef pair<double,ll>pdi;
    const ll inf=1e18;
    const ll mod=998244353;
    const ld Pi=acos(-1) ;
    ll n , m , yes ;
    ll crnt , ans ;
    vpll v [101] ;
    unordered_map < ll , bool > Mask ;
    ll go [101][101] , a [101] , id [101] , done [101] ;
    void dfs ( ll node ) {
            if ( yes == 0 ) return ;
            done [node] = 1 ;
            for ( auto u : v [node] ) {
                    if ( id [node] > id [u.fi] ) C ;
                    if ( done [u.fi] == 1 ) {
                            yes = 0 ;
                            return ;
                    }
                    if ( ( 1 - go [node][u.fi] ) ) {
                            crnt |= (ll)( 1ll << u.se ) ;
                    }
                    if ( done [u.fi] == 2 ) C ;
                    dfs ( u .fi ) ;
                    if ( yes == 0 ) return ;
            }
            done [node] = 2 ;
    }
    int main () {
            cin >> n >> m ;
            for ( int i = 0 ; i < m ; i ++ ) {
                    int a , b ;
                    scanf ("%d%d",&a ,&b );
                    a -- , b -- ;
                    go [a][b] = 1 ;
                    v  [a] .pb ( { b , i } ) ;
                    v  [b] .pb ( { a , i } ) ;
            }
      if ( m > 60 ) while ( 1 ) {}
            for ( int i = 0 ; i < n ; i ++ ) a [i] = i ;
            do {
                    yes = 1 , crnt = 0 ;
                    for ( int i = 0 ; i < n ; i ++ ) {
                            done [i] = 0 ;
                            id [ a [i] ] = i ;
                    }
                    for ( int i = n-1 ; i >=0 ; i -- ) {
                            if ( ! done [i] ) {
                                    dfs ( i ) ;
                            }
                    }
                    ans += (ll)( yes && Mask [crnt] == 0 ) * (ll)( __builtin_popcount ( crnt ) ) ;
             ans %= mod ;
                    if ( yes ) Mask [crnt] = 1 ;
     
            } while ( next_permutation ( a , a + n ) ) ;
            cout << ans % mod << endl ;
    }
Compilation message (stderr)
amusementpark.cpp: In function 'int main()':
amusementpark.cpp:62:27: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   62 |                     scanf ("%d%d",&a ,&b );
      |                     ~~~~~~^~~~~~~~~~~~~~~~| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |