func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long d = 20;   long long n, m, dsu[80], cc[80], al[40], dp[1ll << d];   long long fd(long long x) {     if (dsu[x] != x) {       dsu[x] = fd(dsu[x]);     }     return dsu[x];   }   int main() {     long long i, ii, k, l, mk, mk2, z[4] = {1, 1, 1, 0};     scanf( %lld%lld , &n, &m);     if (!m) {       printf( 0 n );       return 0;     }     for (i = 0; i < n * 2; i++) {       dsu[i] = i;       cc[i] = 1;     }     for (i = 0; i < m; i++) {       scanf( %lld%lld , &k, &l);       k--;       l--;       for (ii = 0; ii < 2; ii++) {         if (fd(k) != fd(n + l)) {           cc[fd(k)] += cc[fd(n + l)];           dsu[fd(n + l)] = fd(k);         }         al[k] |= 1ll << l;         swap(k, l);       }     }     for (i = 0; i < n * 2; i++) {       z[0] *= i >= n || fd(i) != fd(n + i);     }     for (i = 0; i < n; i++) {       if (fd(i) != fd(n + i)) {         cc[fd(i)] += cc[fd(n + i)];         dsu[fd(n + i)] = fd(i);       }     }     for (i = 0; i < n * 2; i++) {       if (fd(i) == i) {         z[0] *= 2;         z[1] *= 2;         z[2] *= 1 + (fd(i) == i && cc[i] == 2);       }     }     for (mk = 0; mk < 1ll << min(d, n); mk++) {       for (i = 0; i < min(d, n); i++) {         if ((mk >> i & 1) && (mk & al[i])) {           break;         }       }       dp[mk] += i >= min(d, n);     }     for (i = 0; i < min(d, n); i++) {       for (mk = (1ll << min(d, n)) - 1; mk + 1; mk--) {         dp[mk] += dp[mk ^ 1ll << i] * (mk >> i & 1);       }     }     for (mk = 0; mk < 1ll << n; mk += 1ll << min(d, n)) {       for (i = min(d, n); i < n; i++) {         if ((mk >> i & 1) && (mk & al[i])) {           break;         }       }       if (i < n) {         continue;       }       mk2 = 0;       for (i = 0; i < min(d, n); i++) {         mk2 |= (long long)!(mk & al[i]) << i;       }       z[3] += dp[mk2];     }     printf( %lld n , (1ll << n) - z[1] - z[3] * 2 + z[0] + z[2] * 2);   }   