Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma GCC optimize("Ofast,unroll-loops")
- #include <bits/stdc++.h>
- #define sz(a) ((int)(a).size())
- #define all(a) (a).begin(), (a).end()
- #define fi first
- #define se second
- using namespace std;
- #ifndef LOCAL
- #define endl '\n'
- #endif
- typedef long long ll;
- typedef pair<int, int> pii;
- const int NMAX = 1005;
- const int INF = 2e9+5;
- struct Edge {
- int dest, flow, rev;
- };
- int n, s, r, f, t;
- vector<Edge> g[NMAX];
- int d[NMAX], last[NMAX];
- int a[NMAX];
- unordered_map<string, int> mp;
- vector<int> v[NMAX];
- int gcd(int x, int y) {
- while (y) {
- int r = x % y;
- x = y;
- y = r;
- }
- return x;
- }
- void io() {
- #ifdef LOCAL
- freopen("input.txt", "r", stdin);
- #else
- ios_base::sync_with_stdio(false);
- cin.tie(0);
- cout.tie(0);
- #endif
- }
- void read() {
- cin >> n;
- for (int i = 1; i <= n; i++)
- cin >> a[i];
- }
- void add_edge(int x, int y, int c) {
- g[x].push_back({ y, c, sz(g[y]) });
- g[y].push_back({ x, 0, sz(g[x]) - 1 });
- }
- void precalc() {
- sort(a + 1, a + n + 1);
- for (int i = 1, d; i <= n; i++) {
- for (int j = i + 1; j <= n; j++) {
- if ((d = gcd(a[i], a[j])) != 1) {
- add_edge(i, j, d);
- add_edge(j, i, d);
- }
- }
- }
- }
- bool bfs() {
- memset(d, 0, sizeof(d));
- memset(last, 0, sizeof(last));
- queue<int> q;
- q.push(1);
- d[1] = 1;
- while (!q.empty()) {
- int u = q.front();
- q.pop();
- if (u == n) continue;
- for (auto &it : g[u]) {
- if (!d[it.dest] && it.flow > 0) {
- d[it.dest] = d[u] + 1;
- q.push(it.dest);
- }
- }
- }
- return d[n];
- }
- int dfs(int x = 1, int flow = INF) {
- if (x == n)
- return flow;
- for (; last[x] < sz(g[x]); last[x]++) {
- Edge &e = g[x][last[x]];
- if (e.flow > 0 && d[e.dest] == d[x] + 1) {
- if (int ret = dfs(e.dest, min(flow, e.flow))) {
- e.flow -= ret;
- g[e.dest][e.rev].flow += ret;
- return ret;
- }
- }
- }
- return 0;
- }
- int dinic() {
- int max_flow = 0;
- while (bfs()) {
- while (int flow = dfs())
- max_flow += flow;
- }
- return max_flow;
- }
- signed main() {
- io();
- read();
- precalc();
- cout << dinic() << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement