#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; const int mod = 19101995; int dp[100005][20]; int ans, n, m; int x, y; vector < int > g[100005]; int go(int v, int len, int p) { if (len < 0) return 0; if (dp[v][len] != -1) return dp[v][len]; dp[v][len] = 0; bool isLeaf = false; vector < int > pr; vector < int > sf; for (int i = 0; i < g[v].size(); ++i) { int to = g[v][i]; if (to == p) continue; int tmp = go(to, len - 1, v); pr.push_back(tmp); sf.push_back(tmp); } if (pr.size() == 0) { dp[v][len] = 1; return 1; } int SZ = pr.size(); for (int i = SZ - 2; i >= 0; --i) { int cur = 1LL * sf[i + 1] * sf[i] % mod; sf[i] = cur; } for (int i = 1; i < SZ; ++i) { int cur = 1LL * pr[i] * pr[i - 1] % mod; pr[i] = cur; } int i = 0; for (int j = 0; j < g[v].size(); ++j) { int to = g[v][j]; if (to == p) continue; long long cur = 1; if (i) cur = cur * pr[i - 1] % mod; if (i != SZ - 1) cur = cur * sf[i + 1] % mod; int tmp = go(to, len, v); cur = cur * tmp % mod; dp[v][len] += cur; if (dp[v][len] >= mod) dp[v][len] -= mod; ++i; } return dp[v][len]; } int main() { // freopen("input.txt", "r", stdin); scanf("%d", &n); for (int i = 0; i < n - 1; i++) { scanf("%d%d", &x, &y); x--; y--; g[x].push_back(y); g[y].push_back(x); } int val = 0; while ((1 << val) <= n) val++; val--; for (int i = 0; i < n; ++i) { for (int j = 0; j <= val; ++j) dp[i][j] = -1; } ans = go(0, val, -1); printf("%d\n", ans); return 0; }