func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAX_N = 41;   const int MASK = 1 << 21;   long long sz[MAX_N], par[MAX_N], po2[MAX_N], vis[MAX_N];   long long dp[MASK];   vector<int> adj[MAX_N];   int rt(int v) { return v ^ par[v] ? par[v] = rt(par[v]) : v; }   void join(int u, int v) {     if ((u = rt(u)) != (v = rt(v))) {       par[v] = u, sz[u] += sz[v];     }   }   int main() {     int n, m;     cin >> n >> m;     if (m < 3) {       cout << 0 << endl;       return 0;     }     po2[0] = 1;     for (int i = 0; i < n; i++) par[i] = i, sz[i] = 1;     for (int i = 1; i < n + 1; i++) po2[i] = po2[i - 1] * 2ll;     long long ans = po2[n];     for (int i = 0; i < m; i++) {       int a, b;       cin >> a >> b;       a--, b--;       join(a, b);       adj[a].push_back(b);       adj[b].push_back(a);     }     set<long long> s;     long long num = 0;     for (int i = 0; i < n; i++) {       s.insert(rt(i));       if (sz[rt(i)] == 1) num++;     }     ans += po2[num + 1] - po2[s.size()];     bool imposs = false;     for (int i = 0; i < n; i++) {       if (vis[i]) continue;       queue<pair<int, int> > q;       q.push({i, 1});       while (q.size()) {         pair<int, int> curr = q.front();         q.pop();         if (vis[curr.first]) {           if (vis[curr.first] != curr.second) {             imposs = true;             break;           } else             continue;         }         vis[curr.first] = curr.second;         for (int next : adj[curr.first]) q.push({next, curr.second ^ 3});       }       if (imposs) break;     }     if (!imposs) ans += po2[s.size()];     num = 0;     for (int mask = 0; mask < 1 << ((n + 1) / 2); mask++) {       bool nowork = false;       long long new_mask = (1 << (n / 2)) - 1;       for (int k = 0; k < (n + 1) / 2; k++) {         if (!(mask & (1 << k))) continue;         for (int nxt : adj[2 * k]) {           if (nxt & 1)             new_mask &= (1 << (n / 2)) - (1 << (nxt / 2)) - 1;           else             nowork = nowork || (mask & (1 << (nxt / 2)));         }       }       if (!nowork) dp[new_mask]++;     }     for (int i = 0; i < n / 2; i++)       for (int mask = 0; mask < 1 << (n / 2); mask++)         if (mask != (mask | (1 << i))) dp[mask] += dp[mask | (1 << i)];     for (int mask = 0; mask < 1 << (n / 2); mask++) {       bool nowork = false;       for (int k = 0; k < n / 2; k++) {         if (!(mask & (1 << k))) continue;         for (long long nxt : adj[2 * k + 1]) {           if (nxt & 1 && mask & (1 << (nxt / 2))) nowork = true;         }       }       if (!nowork) num += dp[mask];     }     ans -= 2ll * num;     cout << ans << endl;   }   