cosenza987

Untitled

Oct 18th, 2025
804
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.67 KB | None | 0 0
  1. //Слава Україні, Героям слава
  2.  
  3. #include <bits/stdc++.h>
  4.  
  5. using namespace std;
  6.  
  7. const int N = 105;
  8. typedef vector<bitset<N>> graph;
  9. #define sz(v) (int)v.size()
  10. struct Maxclique {
  11.     double limit = 0.025, pk = 0;
  12.     struct Vertex {
  13.         int i, d = 0;
  14.     };
  15.     typedef vector<Vertex> vv;
  16.     graph e;
  17.     vv V;
  18.     vector<vector<int>> C;
  19.     vector<int> qmax, q, S, old;
  20.     void init(vv& r) {
  21.         for (auto& v : r) v.d = 0;
  22.         for (auto& v : r) for (auto j : r) v.d += e[v.i][j.i];
  23.         sort(r.begin(), r.end(), [](auto a, auto b) {
  24.             return a.d > b.d;
  25.             });
  26.         int mxD = r[0].d;
  27.         for (int i = 0; i < sz(r); i++) r[i].d = min(i, mxD) + 1;
  28.     }
  29.     void expand(vv& R, int lev = 1) {
  30.         S[lev] += S[lev - 1] - old[lev];
  31.         old[lev] = S[lev - 1];
  32.         while (sz(R)) {
  33.             if (sz(q) + R.back().d <= sz(qmax)) return;
  34.             q.push_back(R.back().i);
  35.             vv T;
  36.             for (auto v : R) if (e[R.back().i][v.i]) T.push_back({ v.i });
  37.             if (sz(T)) {
  38.                 if (S[lev]++ / ++pk < limit) init(T);
  39.                 int j = 0, mxk = 1, mnk = max(sz(qmax) - sz(q) + 1, 1);
  40.                 C[1].clear(), C[2].clear();
  41.                 for (auto v : T) {
  42.                     int k = 1;
  43.                     auto f = [&](int i) {
  44.                         return e[v.i][i];
  45.                         };
  46.                     while (any_of(C[k].begin(), C[k].end(), f)) k++;
  47.                     if (k > mxk) mxk = k, C[mxk + 1].clear();
  48.                     if (k < mnk) T[j++].i = v.i;
  49.                     C[k].push_back(v.i);
  50.                 }
  51.                 if (j > 0) T[j - 1].d = 0;
  52.                 for (int k = mnk; k <= mxk; k++) for (int i : C[k])
  53.                     T[j].i = i, T[j++].d = k;
  54.                 expand(T, lev + 1);
  55.             }
  56.             else if (sz(q) > sz(qmax)) qmax = q;
  57.             q.pop_back(), R.pop_back();
  58.         }
  59.     }
  60.     Maxclique(graph g) : e(g), C(sz(e) + 1), S(sz(C)), old(S) {
  61.         for (int i = 0; i < sz(e); i++) V.push_back({ i });
  62.     }
  63.     vector<int> solve() { // returns the clique
  64.         init(V), expand(V);
  65.         return qmax;
  66.     }
  67. };
  68.  
  69. int main() {
  70.     ios_base::sync_with_stdio(false);
  71.     cin.tie(nullptr);
  72.     int n;
  73.     while(cin >> n) {
  74.         if(n == 0) break;
  75.         vector<long long> v(n);
  76.         for(auto &e : v) cin >> e;
  77.         vector<long long> adj(n);
  78.         graph g(n);
  79.         for(int i = 0; i < n; i++) for(int j = i + 1; j < n; j++) if(__gcd(v[i], v[j]) != 1) g[i][j] = g[j][i] = 1;
  80.         Maxclique M(g);
  81.         cout << M.solve().size() << "\n";
  82.     }
  83.     return 0;
  84. }
  85.  
Advertisement
Add Comment
Please, Sign In to add comment