けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ARC 108 A - Sum and Product (灰色, 300 点)

教育的な約数列挙問題!!

問題概要

2 つの正の整数  S, P が与えられます。

  •  M + N = S
  •  M \times N = P

を満たす正の整数  M, N が存在するかどうかを判定せよ。

制約

  •  1 \le S, P \le 10^{12}

考えたこと

 M として、 P の約数のみを考えれば OK。そして  M を決めると  N N = P / M と決まる。 M + N == S となることがあるかどうかを判定すれば OK。

約数を列挙するのは  O(\sqrt{P}) でできる!

qiita.com

#include <bits/stdc++.h>
using namespace std;

int main() {
    long long S, P;
    cin >> S >> P;
    auto solve = [&]() -> bool {
        for (long long M = 1; M * M <= P; ++M) {
            if (P % M == 0 && M + P/M == S) return true;
        }
        return false;
    };
    cout << (solve() ? "Yes" : "No") << endl;
}