競技プログラミング日記

主に AtCoder の記事です

AtCoder Beginner Contest 096D問題

ABC096D

解法

\( 5\)個選ぶとか,\(55,555\) 以下とかは,あまり意味の無さそうな条件で, 分かりづらいだけなので,一度無視する. 簡単な問題として, \(K\) 個以下選ぶ,\(K = 2,3\) を考える.
\(K = 2\) のとき, \(a_{i}\) を全て \(1\) mod \(2\) となる様にとればよい.
\(K = 3\) のとき, \(a_{i}\) を全て \(1\) mod \(3\) または \(a_{i}\) を全て \(2\) mod \(3\) となる様にとればよい.

\(K = 5\) でも同様. あとは,この取り方で残りの条件を満たすかである. \(M\) 以下の素数の個数が,およそ \(M / log (M)\) であることから, \(a_{i}\) を全て \(r\) mod \(K\) となる \(0 \neq r \in K\) は存在しそうである. 実際,エラトステネスの篩で作ってみると,条件を満たす.

使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"

int main() {
  ll n;
  cin >> n;

  const ll M = 55555;
  vector<bool> is_p(M, true);
  vector<vector<ll>> ps(5);
  for(ll p = 2; p <= M; p++) if(is_p[p]){
    ps[p%5].push_back(p);
    for(ll q = 2*p; q <= M; q += p) {
      is_p[q] = false;
    }
  }

  srep(i,1,5){
    if(ps[i].size() >= 55){
      rep(j,n){
        cout << ps[i][j] << " ";
      }
      return 0;
    }
  }
  assert(false);

  return 0;
}