func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 3e5 + 10, P = 998244353;   const double Pi = acos(-1);   inline int read() {     int x = 0, f = 1, ch = getchar();     while (ch <  0  || ch >  9 ) {       if (ch ==  - ) f = -1;       ch = getchar();     }     while (ch >=  0  && ch <=  9 ) x = x * 10 + ch - 48, ch = getchar();     return x * f;   }   inline int Add(int a, int b) { return a + b >= P ? a + b - P : a + b; }   inline int Sub(int a, int b) { return a - b < 0 ? a - b + P : a - b; }   inline int Mul(int a, int b) {     long long res = 1ll * a * b;     return res >= P ? res % P : res;   }   inline int qpow(int a, int b) {     int res = 1;     while (b) {       if (b & 1) res = Mul(res, a);       a = Mul(a, a);       b >>= 1;     }     return res;   }   int n;   int dp[3][N];   int cnt, head[N];   struct Edge {     int to, nxt;   } edge[N << 1];   inline void AddEdge(int u, int v) {     edge[++cnt] = (Edge){v, head[u]};     head[u] = cnt;     return;   }   void solve(int u, int fa) {     dp[0][u] = dp[2][u] = 1;     for (int i = head[u], v; i; i = edge[i].nxt) {       v = edge[i].to;       if (v == fa) continue;       solve(v, u);       dp[0][u] = Mul(dp[0][u], Add(dp[0][v], dp[1][v]));       dp[1][u] = Add(dp[1][u],                      Mul(dp[2][v], qpow(Add(dp[0][v], Mul(2, dp[1][v])), P - 2)));       dp[2][u] = Mul(dp[2][u], Add(dp[0][v], Mul(2, dp[1][v])));     }     dp[1][u] = Mul(dp[1][u], dp[2][u]);   }   signed main() {     n = read();     for (register int i = 2; i <= n; ++i) {       int a = read(), b = read();       AddEdge(a, b), AddEdge(b, a);     }     solve(1, 0);     printf( %d n , Add(dp[0][1], dp[1][1]));     return 0;   }   