コンテンツにスキップ

AtCoder Beginner Contest 144 C - Walk on Multiplication Table

問題

方針

ある掛け算を \(N\) を (\(i, j\)) の形に表すと、\(i, j\)\(N\) の約数関係である。 制約の \(N\) の約数をすべて列挙しても50個にも満たないので、全部列挙することを考える。 その中で、移動回数は\(i+j-2\)回の最小の数が答えである。

解法

C++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template <class T> inline bool chmin(T &a, T b) {
    if (a > b) {
        a = b;
        return true;
    }
    return false;
}

template <typename T> vector<T> divisor(T N) {
    vector<T> ret;
    if (N == 1) {
        ret.emplace_back(1);
        return ret;
    }
    if (N <= 0) {
        return ret;
    }
    for (unsigned long long i = 1; i * i <= N; i++) {
        if (N % i == 0) {
            ret.emplace_back(i);
            if (i != 1 && i * i != N) {
                ret.emplace_back(N / i);
            }
        }
    }
    ret.emplace_back(N);
    return ret;
}

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

    auto divs = divisor(N);
    ll ans    = (1LL << 60);
    for (auto &&i : divs) {
        ll cnt = (i - 1) + (N / i - 1);
        chmin(ans, cnt);
    }
    cout << ans << endl;

    return 0;
}