【競プロ精進ログ】ABC149-C

zuka

ABCをコツコツ解いていきます。

本記事は,管理人の競技プロ精進日記としてログを取ったものです。モチベーションを爆上げするために,積極的にアウトプットしていく作戦です。

これから競技プログラミングを始めようと考えている人や,なんとなく敷居が高いと感じている人の参考になれば嬉しく思います。その他の記事は以下をご覧ください。

目次

本記事の概要

Atcoderで初心者用のコンテストとして開催されているAtcoder Beginner Contest(通称ABC)を解いていくものです。今回はABC149-C「Next Prime」です。

ポイント

素数判定は$O(\sqrt{N})$で行えるということは確実におさえておきましょう。なぜなら,整数$x$における$x$以外の約数は$\sqrt{N}$以下です。すなわち,$x$が素数であるかどうかを調べるためには,$2 \leq n \leq \sqrt{N}$の$n$に対して$x$を割り切れるかどうかを調べればOKだからです。

今回の場合は,さらに$10^5+3$が素数であることを知っていれば,$X$が最大値$10^5$をとったとしても,$X$以上の素数がすぐに見つかることが分かります。以上の考察から,$X$以上の全ての整数について素数判定を行えば良いです。

おさえるべき内容

 素数判定の計算量は$O(\sqrt{N})$

実装

#include <bits/stdc++.h>
#define _GLIBCXX_DEBUG
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define repi(i, a, b) for (int i = (int)(a); i < (int)(b); i++)
using namespace std;

int main(){
  int x;
  cin >> x;
  int ans;
  while (true){
    // 素数かどうかの判定フラグ
    bool flag = true;
    // repマクロは使わずに2以上xの平方根以下の全てのiについて調べるループを書く
    for (int i = 2; i*i <= (int)(x); i++) {
      // xを割り切るものがあれば素数でないのでfalseにする
      if (x % i == 0) flag = false;
    }
  // もし割り切る整数がなければ素数なのでbreak
  if (flag == true) break;
  // 割り切る整数が1つでもあれば次のxに進む
  x++;
  }
  cout << x << endl;
}
よかったらシェアしてね!

コメント

コメントする

目次
閉じる