#include #include #include #include using namespace std; #define maxn 2000000 + 5 #define mod 19101995 int n, m, occured[maxn][21], mem[maxn][21], f[maxn], t[maxn], p[maxn], ii, depth[maxn], i, back, x, y; int v1[maxn + maxn], v2[maxn + maxn], act_v2[maxn + maxn], L[maxn], c[maxn], R[maxn], ret, hl, alt = 1 ; bool was[maxn]; void addedge (int x, int y) { t[++ii] = y; p[ii] = f[x]; f[x] = ii; } int dfs (int k, int light_up, int pr) { if (light_up > m) return 0; if (occured[k][light_up]) return mem[k][light_up]; occured[k][light_up] = true; was[k] = true; int q = f[k], sz = 0; while (q > 0) { if (t[q] != pr) { depth[t[q]] = 1 + depth[t[q]]; v1[L[k] + sz] = dfs(t[q], light_up, k); v2[L[k] + sz] = dfs(t[q], light_up + 1, k); act_v2[L[k] + sz] = v2[L[k] + sz]; ++sz; } q = p[q]; } if (sz > 1) for(i = sz - 2; i + 1; i--) v2[L[k] + i] = (v2[L[k] + i + 1] * 1LL * v2[L[k] + i]) % mod; v2[L[k] + sz] = 1; act_v2[L[k] + sz] = 1; back = 1; ret = 0; q = f[k]; hl = 0; while (q > 0) { if (t[q] != pr) { ++hl; ret = (ret + (v2[L[k] + hl] * 1LL * v1[L[k] + hl - 1]) % mod * back) % mod; back = (back * 1LL * act_v2[L[k] + hl - 1]) % mod; } q = p[q]; } if (sz == 0) ret = 1; return mem[k][light_up] = ret; } int main (int argc, char * const argv[]) { // freopen("input.txt", "r", stdin); scanf("%d", &n); for(i = 1; i <= n; i++) c[i] = 1; for(i = 1; i < n; i++) { scanf("%d %d", &x, &y); addedge(x, y); addedge(y, x); ++c[x]; ++c[y]; } for(i = 1; i <= n; i++) { L[i] = R[i - 1] + 1; R[i] = L[i] + c[i]; } m = 0; while ((1 << m) <= n) ++m; --m; printf("%d\n", dfs(1, 0, -1)); return 0; }