kdzhr

Размещение данных

Sep 20th, 2020
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.40 KB | None | 0 0
  1. // https://informatics.mccme.ru/mod/statements/view3.php?id=24702&chapterid=113441#1
  2.  
  3. #include <iostream>
  4. #include <vector>
  5. #include <set>
  6.  
  7. #define all(a) a.begin(), a.end()
  8. #define rall(a) a.rbegin(), a.rend()
  9.  
  10. // #define file_io
  11. // #define many_tasks
  12. #define int int32_t
  13. #define ll int64_t
  14.  
  15. #define uint uint32_t
  16. #define ull uint64_t
  17.  
  18. #define db double
  19. #define ld long double
  20.  
  21. const int MOD = 1e9 + 7;
  22.  
  23. int mul(int a, int b) {
  24. return 1ll * a * b % MOD;
  25. }
  26.  
  27. void ios() {
  28. std::ios_base::sync_with_stdio(false);
  29. std::cin.tie(nullptr);
  30. std::cout.tie(nullptr);
  31. }
  32.  
  33.  
  34. void dfs(std::vector<std::vector<std::pair<int, int>>> &g, std::vector<int> &tin, std::vector<int> &fup,
  35. std::vector<bool> &used,
  36. std::set<int> &ans, int &time, int v, int prev) {
  37. tin[v] = fup[v] = time++;
  38. used[v] = true;
  39. for (auto &elem : g[v]) {
  40. auto to = elem.first;
  41. if (to == prev) continue;
  42. if (used[to]) {
  43. fup[v] = std::min(fup[v], tin[to]);
  44. } else {
  45. dfs(g, tin, fup, used, ans, time, to, v);
  46. fup[v] = std::min(fup[v], fup[to]);
  47. if (fup[to] > tin[v]) ans.insert(elem.second);
  48. }
  49. }
  50. }
  51.  
  52. void dfs(std::vector<std::vector<std::pair<int, int>>> &g, std::vector<bool> &used, std::set<int> &black,
  53. std::vector<int> &cs, int cs_num, int v) {
  54. used[v] = true;
  55. cs[v] = cs_num;
  56. for (auto &elem : g[v]) {
  57. if (!used[elem.first] && black.find(elem.second) == black.end()) {
  58. dfs(g, used, black, cs, cs_num, elem.first);
  59. }
  60. }
  61. }
  62.  
  63. void solve() {
  64. int n, m;
  65. std::cin >> n >> m;
  66. std::vector<std::vector<std::pair<int, int>>> g(n + 1);
  67. std::vector<int> tin(n + 1), fup(n + 1);
  68. std::vector<bool> used(n + 1, false);
  69. std::set<int> ans;
  70. std::vector<std::pair<int, int>> inp(m);
  71. for (int i = 0; i < m; ++i) {
  72. int a, b;
  73. std::cin >> a >> b;
  74. g[a].push_back({b, i});
  75. g[b].push_back({a, i});
  76. inp[i] = {a, b};
  77. }
  78. int time = 0;
  79. for (int i = 1; i <= n; ++i) {
  80. if (!used[i]) {
  81. dfs(g, tin, fup, used, ans, time, i, -1);
  82. }
  83. }
  84.  
  85. for (int i = 0; i <= n; ++i) used[i] = false;
  86.  
  87. std::vector<int> cmp(n + 1, -1);
  88. int cmp_num = 1;
  89. for (int i = 1; i <= n; ++i) {
  90. if (!used[i]) dfs(g, used, ans, cmp, cmp_num++, i);
  91. }
  92. std::vector<int> st(cmp_num, 0);
  93. std::vector<int> cnt(cmp_num, 0);
  94. for (int i = 1; i <= n; ++i) ++cnt[cmp[i]];
  95. for (auto &elem : inp) {
  96. if (cmp[elem.first] != cmp[elem.second]) {
  97. ++st[cmp[elem.first]];
  98. ++st[cmp[elem.second]];
  99. }
  100. }
  101. if (cmp_num == 2) {
  102. std::cout << 1 << ' ' << n;
  103. return;
  104. }
  105. int res = 1;
  106. int res_cnt = 0;
  107. for (int i = 1; i < cmp_num; ++i) {
  108. if (st[i] == 1) {
  109. res = mul(res, cnt[i]);
  110. ++res_cnt;
  111. }
  112. }
  113. std::cout << res_cnt << ' ' << res;
  114. }
  115.  
  116. //-----------------------------------------------------------------------------------------------//
  117.  
  118. int main() {
  119. #ifdef file_io
  120. freopen("C:\\file_io\\input.txt", "r", stdin);
  121. freopen("C:\\file_io\\output.txt", "w", stdout);
  122. #endif
  123. ios();
  124. #ifdef many_tasks
  125. size_t t;
  126. std::cin >> t;
  127. while (t-- > 0) {
  128. solve();
  129. }
  130. #else
  131. solve();
  132. #endif
  133. return 0;
  134. }
Add Comment
Please, Sign In to add comment