Advertisement
Galebickosikasa

Untitled

Jul 15th, 2020
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.97 KB | None | 0 0
  1. #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
  2. #pragma GCC target("sse,sse2,sse3,ssse3,sse4,sse4.1,sse4.2,popcnt,abm,mmx,avx")
  3. // #pragma comment(linker, "/stack:200000000"]
  4.  
  5. #include <iostream>
  6. #include <vector>
  7. #include <cmath>
  8. #include <algorithm>
  9. #include <unordered_set>
  10. #include <unordered_map>
  11. #include <set>
  12. #include <map>
  13. #include <queue>
  14. #include <deque>
  15. #include <bitset>
  16. #include <stack>
  17. #include <random>
  18. #include <fstream>
  19. #include <sstream>
  20. #include <chrono>
  21.  
  22. #define fi first
  23. #define se second
  24. #define pb push_back
  25. #define ll long long
  26. #define ld long double
  27. #define hm unordered_map
  28. #define pii pair<int, int>
  29. #define sz(a) (int)a.size()
  30. #define all(a) a.begin(), a.end()
  31. #define cinv(v) for (auto& x: v) cin >> x
  32. #define fr(i, n) for (int i = 0; i < n; ++i)
  33. #define fl(i, l, n) for (int i = l; i < n; ++i)
  34.  
  35. #define int ll
  36.  
  37. using namespace std;
  38.  
  39. #ifdef __LOCAL
  40. #define dbg(x) cerr << #x << " : " << x << '\n'
  41. const int maxn = 400 + 20;
  42. #else
  43. #define dbg(x)
  44. const int maxn = 400 + 20;
  45. #endif
  46.  
  47. //tg: @galebickosikasa
  48.  
  49. const ll inf = (ll) 2e9;
  50. const ld pi = asin (1) * 2;
  51. const ld eps = 1e-8;
  52. const ll mod = (ll)1e9 + 7;
  53. const ll ns = 97;
  54. const int C = 200;
  55.  
  56. mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
  57.  
  58. struct edge {
  59. int to, c, f;
  60. };
  61.  
  62. vector<edge> edges;
  63. vector<int> g[maxn];
  64. int it[maxn], d[maxn], used[maxn];
  65. int timer = 1;
  66.  
  67. int bfs (int s, int t, int x) {
  68. for (auto& x: d) x = inf;
  69. d[s] = 0;
  70. queue<int> a;
  71. a.push (s);
  72. while (!a.empty ()) {
  73. int v = a.front ();
  74. a.pop ();
  75. // dbg (v);
  76. for (auto& u: g[v]) {
  77. auto& e = edges[u];
  78. // dbg (e.to);
  79. if (d[e.to] == inf && e.c - e.f >= x) {
  80. d[e.to] = d[v] + 1;
  81. a.push (e.to);
  82. }
  83. }
  84. }
  85. return d[t] < inf;
  86. }
  87.  
  88. int dfs (int v, int t, int start, int x, int cnt = 0, int c = inf, int p = -1) {
  89. dbg (v);
  90. dbg (start);
  91. if (v == t && p - C == start && cnt > 5) return c;
  92. if (v == t) return 0;
  93. used[v] = timer;
  94. if (p == 400) start = v;
  95. for (auto& u: g[v]) {
  96. auto& e = edges[u];
  97. if ((e.to != start + C && used[e.to] == timer) || e.c - e.f < x) {
  98. continue;
  99. }
  100. int delta = dfs (e.to, t, start, x, cnt + 1, min (c, e.c - e.f), v);
  101. if (delta > 0) {
  102. auto& _e = edges[u^1];
  103. e.f += delta;
  104. _e.f -= delta;
  105. return delta;
  106. }
  107. }
  108. return 0;
  109. }
  110.  
  111. int kek (int x) {
  112. for (int i = 2; i * i <= x; ++i) {
  113. if (x % i == 0) return 0;
  114. }
  115. return 1;
  116. }
  117.  
  118. signed main () {
  119. ios_base::sync_with_stdio(false);
  120. cin.tie(nullptr);
  121. cout.tie(nullptr);
  122. int n;
  123. cin >> n;
  124. vector<int> goo (n);
  125. cinv (goo);
  126. fr (i, n) {
  127. fr (j, n) {
  128. if (i == j) continue;
  129. if (kek (goo[i] + goo[j])) {
  130. g[i].pb (sz (edges));
  131. edges.pb ({j + C, 1, 0});
  132. g[j + C].pb (sz (edges));
  133. edges.pb ({i, 0, 0});
  134. }
  135. }
  136. }
  137. int s = 400, t = 400 + 1;
  138. fr (i, n) {
  139. g[s].pb (sz (edges));
  140. edges.pb ({i, 1, 0});
  141. g[i].pb (sz (edges));
  142. edges.pb ({s, 0, 0});
  143. g[i + C].pb (sz (edges));
  144. edges.pb ({t, 1, 0});
  145. g[t].pb (sz (edges));
  146. edges.pb ({i + C, 0, 0});
  147. g[i + C].pb (sz (edges));
  148. edges.pb ({i, 1, 0});
  149. g[i].pb (sz (edges));
  150. edges.pb ({i + C, 0, 0});
  151. }
  152. while (dfs (s, t, -1, 1)) {
  153. dbg ("kek");
  154. ++timer;
  155. }
  156. ++timer;
  157. dbg ("kek");
  158. vector<vector<int>> ans;
  159. fr (i, n) {
  160. if (used[i] < timer) {
  161. int v = i;
  162. vector<int> t;
  163. for (auto& x: g[i]) {
  164. if (edges[x].f == 1) {
  165. v = edges[x].to - C;
  166. break;
  167. }
  168. }
  169. if (v == i) {
  170. cout << "Impossible\n";
  171. exit (0);
  172. }
  173. t.pb (i);
  174. while (v != i) {
  175. // dbg (v);
  176. t.pb (v);
  177. for (auto& x: g[v]) {
  178. if (edges[x].f == 1) {
  179. v = edges[x].to - C;
  180. }
  181. }
  182. if (v == t.back ()) {
  183. cout << "Impossible\n";
  184. exit (0);
  185. }
  186. }
  187. for (auto& x: t) used[x] = timer;
  188. ans.pb (t);
  189. }
  190. }
  191. cout << sz (ans) << '\n';
  192. for (auto& v: ans) {
  193. for (auto& x: v) cout << x + 1 << ' ';
  194. cout << '\n';
  195. }
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement