func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, siz[500010];   vector<int> v[500010];   class DS {    public:     long long dat[2][2];     DS() { memset(dat, 0, sizeof(dat)); }     DS(long long a00, long long a01, long long a10, long long a11) {       dat[0][0] = a00;       dat[0][1] = a01;       dat[1][0] = a10;       dat[1][1] = a11;     }     DS trans() {       return DS(dat[1][0], dat[0][0] + dat[1][1], dat[0][0], dat[0][1]);     }     DS operator*(const DS &t) const {       DS ret;       for (int i = 0; i < 2; i++) {         for (int j = 0; j < 2; j++) {           for (int k = 0; k + i < 2; k++) {             for (int l = 0; j + l < 2; l++) {               ret.dat[i + k][j + l] += dat[i][j] * t.dat[k][l];             }           }         }       }       return ret;     }   } f[500010], g[500010];   void dfs(int np, int fath) {     f[np] = DS(1, 0, 0, 0);     siz[np] = 1;     for (int &x : v[np]) {       if (x == fath) continue;       dfs(x, np);       siz[np] += siz[x];       f[np] = f[np] * f[x].trans();     }   }   void dfs2(int np, int fath) {     vector<DS> pre;     pre.push_back(DS(1, 0, 0, 0));     for (int i = 0; i < v[np].size(); i++) {       if (v[np][i] == fath)         pre.push_back(pre.back());       else         pre.push_back(pre.back() * f[v[np][i]].trans());     }     DS cur = fath ? g[np].trans() : DS(1, 0, 0, 0);     for (int i = (int)v[np].size() - 1; i >= 0; i--) {       if (v[np][i] == fath) continue;       g[v[np][i]] = cur * pre[i];       dfs2(v[np][i], np);       cur = cur * f[v[np][i]].trans();     }   }   int main() {     scanf( %d , &n);     if (n & 1) {       puts( 0 );       return 0;     }     for (int i = 1, a, b; i < n; i++) {       scanf( %d%d , &a, &b);       v[a].push_back(b);       v[b].push_back(a);     }     dfs(1, 0);     dfs2(1, 0);     long long ans = 0;     for (int i = 2; i <= n; i++) {       if (f[i].dat[1][0] == 1 && g[i].dat[1][0] == 1)         ans += (long long)siz[i] * (n - siz[i]);       else         ans +=             (f[i].dat[0][0] + f[i].dat[1][1]) * (g[i].dat[0][0] + g[i].dat[1][1]);     }     printf( %lld n , ans);     return 0;   }   