---
# System prepended metadata

title: ARC118-C Coprime Set

---

# ARC118-C Coprime Set

diff11
https://atcoder.jp/contests/arc118/tasks/arc118_c

## 解法

$N = 3$のとき、$S = ( 6, 10, 15 )$は条件を満たす。

$N \gt 3$のときも$S$に値を追加することで構築することを目指す。$\gcd(6, 10, 15) = 1$のため、何を追加しても$\gcd(S) = 1$である。素因数$2, 3, 5$から2種類以上の素因数を含む値を追加し続けると$i\ne j\rightarrow \gcd(S_i, S_j)\gt 1$を満たす。

この方針で構築できる最大サイズは2663であるようだ。制約$N\le 2500$の範囲内で構築することができた

## 実装

```cpp=
#include <bits/stdc++.h>

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    const int MAX{10001};

    std::vector<int> A;
    std::vector<bool> vis(MAX);
    auto dfs{[&](auto dfs, int v) -> void {
        A.push_back(v);
        vis[v] = true;
        for (int i{2} ; i * v <= MAX ; i++) if (!vis[i * v])
            dfs(dfs, i * v);
    }};
    for (auto v : { 2 * 3, 2 * 5, 3 * 5 }) {
        for (int i{2} ; i * v <= MAX ; i++) if (!vis[i * v]) 
            dfs(dfs, i * v);
    }
    // dfs(dfs, 2 * 3);
    // dfs(dfs, 2 * 5);
    // dfs(dfs, 3 * 5);
    std::sort(A.begin(), A.end());
    A.erase(std::unique(A.begin(), A.end()), A.end());
    int N;
    std::cin >> N;
    N -= 3;
    std::cout << 2 * 3 << ' ' << 2 * 5 << ' ' << 3 * 5;
    for (int i{} ; i < N ; i++) std::cout << ' ' << A[i];
    std::cout << '\n';
}

```

[提出リンク](https://atcoder.jp/contests/arc118/submissions/58042088)

## 感想

めっちゃ時間かかった。構築苦手だし嫌いだ....