fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5. ios_base::sync_with_stdio(false);
  6. cin.tie(NULL);
  7. int n, m;
  8. cin >> n >> m;
  9. queue<int>BFS;
  10. vector<int>topo;
  11. vector<int>adj[n + 1];
  12. vector<int>par(n + 1);
  13. vector<int>uadj[n + 1];
  14. vector<int>dist(n + 1);
  15. vector<bool>vis(n + 1);
  16. vector<int>degree(n + 1);
  17. vector<int64_t>pre[n + 1];
  18. vector<int64_t>suf[n + 1];
  19. pair<int, int>edges[n - 1];
  20. vector<size_t>index(n + 1);
  21. vector<int64_t>up(n + 1, 1);
  22. vector<int64_t>down(n + 1, 1);
  23. for (int i = 0; i < n - 1; ++i)
  24. {
  25. cin >> edges[i].first >> edges[i].second;
  26. uadj[edges[i].first].push_back(edges[i].second);
  27. uadj[edges[i].second].push_back(edges[i].first);
  28. }
  29. BFS.push(1);
  30. dist[1] = 0;
  31. while (!BFS.empty())
  32. {
  33. vis[BFS.front()] = true;
  34. for (int& v: uadj[BFS.front()])
  35. {
  36. if (!vis[v])
  37. {
  38. BFS.push(v);
  39. dist[v] = dist[BFS.front()] + 1;
  40. }
  41. }
  42. BFS.pop();
  43. }
  44. for (int i = 0; i < n - 1; ++i)
  45. {
  46. if (dist[edges[i].first] > dist[edges[i].second])
  47. {
  48. swap(edges[i].first, edges[i].second);
  49. }
  50. }
  51. for (int i = 0; i < n - 1; ++i)
  52. {
  53. adj[edges[i].first].push_back(edges[i].second);
  54. par[edges[i].second] = edges[i].first;
  55. ++degree[edges[i].second];
  56. }
  57. BFS = queue<int>({ 1 });
  58. while (!BFS.empty())
  59. {
  60. topo.push_back(BFS.front());
  61. for (int& v: adj[BFS.front()])
  62. {
  63. if (--degree[v] == 0)
  64. {
  65. BFS.push(v);
  66. }
  67. }
  68. BFS.pop();
  69. }
  70. reverse(topo.begin(), topo.end());
  71. for (int& u: topo)
  72. {
  73. for (int& v: adj[u])
  74. {
  75. (down[u] *= down[v]) %= m;
  76. }
  77. ++down[u] %= m;
  78. }
  79. for (int u = 1; u <= n; ++u)
  80. {
  81. int idx = 0;
  82. for (int& v: adj[u])
  83. {
  84. index[v] = idx;
  85. pre[u].push_back(down[v]);
  86. suf[u].push_back(down[v]);
  87. ++idx;
  88. }
  89. }
  90. for (int u = 1; u <= n; ++u)
  91. {
  92. if (!adj[u].empty())
  93. {
  94. for (int i = 1; i < pre[u].size(); ++i)
  95. {
  96. (pre[u][i] *= pre[u][i - 1]) %= m;
  97. }
  98. for (int i = suf[u].size() - 2; i >= 0; --i)
  99. {
  100. (suf[u][i] *= suf[u][i + 1]) %= m;
  101. }
  102. }
  103. }
  104. reverse(topo.begin(), topo.end());
  105. for (int& v: topo)
  106. {
  107. if (par[v])
  108. {
  109. up[v] = up[par[v]];
  110. if (index[v])
  111. {
  112. (up[v] *= pre[par[v]][index[v] - 1]) %= m;
  113. }
  114. if (index[v] < suf[par[v]].size() - 1)
  115. {
  116. (up[v] *= suf[par[v]][index[v] + 1]) %= m;
  117. }
  118. ++up[v] %= m;
  119. }
  120. }
  121. for (int i = 1; i <= n; ++i)
  122. {
  123. cout << (down[i] * up[i] - up[i] + m) % m << "\n";
  124. }
  125. return 0;
  126. }
Runtime error #stdin #stdout 0.02s 5288KB
stdin
Standard input is empty
stdout
Standard output is empty