# 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) ## 感想 めっちゃ時間かかった。構築苦手だし嫌いだ....