diff --git a/TangDou/Topic/HuanGenDp/SubTree.cpp b/TangDou/Topic/HuanGenDp/SubTree.cpp index 7cf6652..8144447 100644 --- a/TangDou/Topic/HuanGenDp/SubTree.cpp +++ b/TangDou/Topic/HuanGenDp/SubTree.cpp @@ -4,44 +4,49 @@ using namespace std; #define endl "\n" const int N = 100010; -int n, m; +int n, mod; vector s[N]; -int dp[N], pd[N]; +int f[N], g[N]; void dfs1(int x, int fa) { - for (int i : s[x]) { - if (i != fa) { - dfs1(i, x); - dp[x] = dp[x] * (dp[i] + 1) % m; - } + for (int v : s[x]) { + if (v == fa) continue; + dfs1(v, x); + f[x] = f[x] * (f[v] + 1) % mod; } } void dfs2(int x, int fa) { - int t = pd[x]; - for (int i : s[x]) - if (i != fa) - pd[i] = pd[i] * t % m; + int t = g[x]; + for (int v : s[x]) { + if (v == fa) continue; + g[v] = g[v] * t % mod; + } + t = 1; - for (int i : s[x]) - if (i != fa) - pd[i] = pd[i] * t % m, t = t * (dp[i] + 1) % m; + for (int v : s[x]) { + if (v == fa) continue; + g[v] = g[v] * t % mod, t = t * (f[v] + 1) % mod; + } + t = 1; reverse(s[x].begin(), s[x].end()); - for (int i : s[x]) - if (i != fa) - pd[i] = pd[i] * t % m, t = t * (dp[i] + 1) % m; - for (int i : s[x]) - if (i != fa) { - ++pd[i]; - dfs2(i, x); - } + for (int v : s[x]) { + if (v == fa) continue; + g[v] = g[v] * t % mod, t = t * (f[v] + 1) % mod; + } + + for (int v : s[x]) { + if (v == fa) continue; + g[v]++; + dfs2(v, x); + } } signed main() { - cin >> n >> m; - for (int i = 1; i <= n; i++) dp[i] = pd[i] = 1; + cin >> n >> mod; + for (int i = 1; i <= n; i++) f[i] = g[i] = 1; for (int i = 1; i < n; i++) { int a, b; cin >> a >> b; @@ -50,5 +55,5 @@ signed main() { dfs1(1, 0); dfs2(1, 0); - for (int i = 1; i <= n; ++i) cout << dp[i] * pd[i] % m << endl; + for (int i = 1; i <= n; ++i) cout << f[i] * g[i] % mod << endl; } \ No newline at end of file