func_code_string: #include <bits/stdc++.h>   using namespace std;   const int P = 998244353;   int add(int a, int b) {     if ((a += b) >= P) a -= P;     return a < 0 ? a + P : a;   }   int mul(int a, int b) { return 1ll * a * b % P; }   int kpow(int a, int b) {     int r = 1;     for (; b; b >>= 1, a = mul(a, a)) {       if (b & 1) r = mul(r, a);     }     return r;   }   const int N = 3e5 + 7;   int f[N][2][2], n, u, v, pre[N], suf[N];   vector<int> g[N];   void dfs(int u, int fa) {     int p = -1;     for (int i = (0); i < ((int)g[u].size()); i++)       if (g[u][i] == fa) {         p = i;         break;       }     if (p >= 0) g[u].erase(g[u].begin() + p);     f[u][0][0] = 1;     f[u][1][0] = 1;     for (auto v : g[u]) {       dfs(v, u);       f[u][0][0] = mul(f[u][0][0], add(f[v][0][0], f[v][1][1]));       f[u][1][0] = mul(f[u][1][0], add(f[v][0][0], mul(f[v][1][1], 2)));       pre[v] = suf[v] = add(f[v][0][0], mul(f[v][1][1], 2));     }     f[u][1][0] = add(f[u][1][0], -f[u][0][0]);     for (int i = (1); i < ((int)g[u].size()); i++)       pre[g[u][i]] = mul(pre[g[u][i]], pre[g[u][i - 1]]);     for (int i = ((int)g[u].size() - 1) - 1; i >= (0); i--)       suf[g[u][i]] = mul(suf[g[u][i]], suf[g[u][i + 1]]);     for (int i = (0); i < ((int)g[u].size()); i++) {       int v = g[u][i], t = add(f[v][1][0], f[v][0][0]);       if (i) t = mul(t, pre[g[u][i - 1]]);       if (i + 1 < (int)g[u].size()) t = mul(t, suf[g[u][i + 1]]);       f[u][1][1] = add(f[u][1][1], t);     }   }   int main() {     std::ios::sync_with_stdio(false);     std::cin.tie(0);     cin >> n;     for (int i = (1); i < (n); i++) {       cin >> u >> v;       g[u].push_back(v);       g[v].push_back(u);     }     dfs(1, 0);     cout << add(f[1][0][0], f[1][1][1]);     return 0;   }   