记 $f_{i,j}$ 表示确定完 $i$ 子树内每条边的选取情况(包括叶子到根的边)后,有 $j$ 条路径能从 $i$ 走到叶子再走到根的方案数。

那么 $j>1$ 时,会产生环,$f_{i,j}=0$。
当 $j\le1$ 时:

  • 对于 $f_{u,1},f_{v,1}$,必须删除边 $(u,v)$,否则会产生环。
  • 对于 $f_{u,0},f_{v,0}$,必须保留边 $(u,v)$,否则 $v$ 就无法连接到根了。
  • 对于 $f_{u,0},f_{v,1}$,边 $(u,v)$ 任意。如果删除则贡献给 $f_{u,0}$;如果保留则贡献给 $f_{v,1}$。
  • 对于 $f_{u,1},f_{v,0}$,必须保留边 $(u,v)$,否则 $v$ 就无法连接到根了。

最终答案就是 $f_{1,0}$,因为不存在从根走到叶子在走到根的环。

#include<bits/stdc++.h>
#define siz(x) int((x).size())
#define all(x) std::begin(x),std::end(x)
#define fi first
#define se second
using namespace std;
using unt=unsigned;
using loli=long long;
using lolu=unsigned long long;
using pii=pair<int,int>;
mt19937_64 rng(random_device{}());
constexpr int N=2e5+7,P=998244353;
struct mint{
	int d;
	mint()=default;
	mint(int x):d(x){}
	friend std::istream&operator>>(std::istream&x,mint&y){return x>>y.d;}
	friend std::ostream&operator<<(std::ostream&x,mint y){return x<<y.d;}
	friend mint operator+(mint x,mint y){return (x.d+=y.d)<P?x.d:x.d-P;}
	mint&operator+=(mint z){return (d+=z.d)<P?d:d-=P,*this;}
	friend mint operator-(mint x,mint y){return (x.d-=y.d)<0?x.d+P:x.d;}
	mint&operator-=(mint z){return (d-=z.d)<0?d+=P:d,*this;}
	friend mint operator*(mint x,mint y){return int(1ll*x.d*y.d%P);}
	mint&operator*=(mint z){return d=int(1ll*d*z.d%P),*this;}
	static mint qpow(int x,int y=P-2){int z=1;for(;y;y>>=1,x=int(1ll*x*x%P))if(y&1)z=int(1ll*x*z%P);return z;}
	friend mint operator/(mint x,mint y){return x*=qpow(y.d);}
	mint&operator/=(mint z){return (*this)*=qpow(z.d);}
	friend mint operator^(mint x,mint y){return qpow(x.d,y.d);}
	mint&operator^=(mint z){return *this=qpow(d,z.d);}
	mint operator()(mint z)const{return qpow(d,z.d);}
	mint&operator[](mint z){return *this=qpow(d,z.d);}
	mint inv()const{return qpow(d);}
	mint pow(mint z)const{return qpow(d,z.d);}
	int operator+()const{return d;}
	mint operator-()const{return d?P-d:0;}
	int operator~()const{return ~d;}
};
mint operator""_m(lolu x){return mint(int(x%P));}
int n;
mint f[N][2];
vector<int>e[N];
void dfs(int u,int fa){
	f[u][0]=1;
	if(u!=1&&siz(e[u])==1){
		f[u][1]=1;
	}else for(int v:e[u])if(v!=fa){
		dfs(v,u);
		mint g0=0,g1=0;
		g0+=f[u][0]*f[v][0];
		g1+=f[u][1]*f[v][1];
		g0+=f[u][0]*f[v][1];
		g1+=f[u][0]*f[v][1];
		g1+=f[u][1]*f[v][0];
		f[u][0]=g0;f[u][1]=g1;
	}
}
signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	ios::sync_with_stdio(false);cin.tie(nullptr);
	cin>>n;
	for(int i=1,u,v;i<n;i++){
		cin>>u>>v;
		e[u].push_back(v);
		e[v].push_back(u);
	}
	dfs(1,0);
	cout<<f[1][0]<<'\n';
	return 0;
}