#include using namespace std; const int mod = 19101995; const int mx = 100005, mx_log = 20; int dp[mx][mx_log]; int n; vector edges[mx], child[mx]; int vis[mx]; void dfs(int x) { vis[x] = 1; for(int i = 0; i < edges[x].size(); ++i) if(!vis[edges[x][i]]) { dfs(edges[x][i]); child[x].push_back(edges[x][i]); } } int solve(int x, int c) { if((1 << c) > n) return 0; int &ret = dp[x][c]; if(ret != -1) return ret; ret = 0; int cnt = child[x].size(); if(cnt == 0) return ret = 1; vector ways_left(cnt), ways_right(cnt); int prod = 1; for(int i = 0; i < cnt; ++i) { prod = 1ll * prod * solve(child[x][i], c + 1) % mod; ways_left[i] = prod; } prod = 1; for(int i = cnt - 1; i >= 0; --i) { prod = 1ll * prod * solve(child[x][i], c + 1) % mod; ways_right[i] = prod; } for(int i = 0; i < cnt; ++i) { int cur = 1; if(i) cur = 1ll * cur * ways_left[i - 1] % mod; if(i < cnt - 1) cur = 1ll * cur * ways_right[i + 1] % mod; cur = 1ll * cur * solve(child[x][i], c) % mod; ret = (ret + cur) % mod; } return ret; } int main() { scanf("%d", &n); for(int i = 0; i < n - 1; ++i) { int a, b; scanf("%d %d", &a, &b); edges[a].push_back(b); edges[b].push_back(a); } dfs(1); memset(dp, -1, sizeof(dp)); printf("%d\n", solve(1, 0)); return 0; }