func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 2e5 + 5;   int dis[40];   long long adj[40];   vector<long long> v1;   vector<long long> v2;   void bt(int l, int r, long long mask) {     if (l == r) {       v1.emplace_back(mask);       return;     }     bt(l + 1, r, mask);     if (adj[l] & mask) return;     bt(l + 1, r, mask | (1ll << l));   }   long long f[1 << 21];   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     int n;     cin >> n;     int m;     cin >> m;     long long ans = 1;     for (int i = 0; i < n; ++i) ans *= 2;     for (int i = 0; i < m; ++i) {       int x;       cin >> x;       --x;       int y;       cin >> y;       --y;       adj[x] |= (1ll << y);       adj[y] |= (1ll << x);     }     long long cnt1 = 1;     long long cnt01 = 1;     long long cnt02 = 1;     for (int j = 0; j < n; ++j)       if (adj[j] == 0) cnt01 *= 2;     fill(dis, dis + n, -1);     for (int i = 0; i < n; ++i)       if (dis[i] < 0) {         cnt1 *= 2;         cnt02 *= 2;         int S = 0;         queue<int> qu;         qu.push(i);         dis[i] = 0;         while (qu.size()) {           int u = qu.front();           qu.pop();           S++;           for (int v = 0; v < n; ++v)             if (adj[u] >> v & 1) {               if (dis[v] < 0) dis[v] = dis[u] ^ 1, qu.push(v);               if (dis[v] == dis[u]) cnt02 = 0;             }         }       }     if (ans == cnt1) ans = 0;     ans -= cnt1;     ans += cnt01 * 2;     ans += cnt02;     m = n / 2;     bt(m, n, 0);     v1.swap(v2);     bt(0, m, 0);     for (long long x : v2) {       int M = 0;       for (int i = 0; i < m; ++i) {         if (adj[i] & x)           continue;         else           M |= (1 << i);       }       f[M]++;     }     for (int i = 0; i < m; ++i)       for (int j = 0; j < (1 << m); ++j)         if (j >> i & 1) f[j ^ (1 << i)] += f[j];     for (long long x : v1) ans -= f[x], ans -= f[x];     cout << ans << endl;   }   