AtCoder Beginner Contest 144 C - Walk on Multiplication Table
方針
ある掛け算を $N$ を ($i, j$) の形に表すと、$i, j$ は $N$ の約数関係である。 制約の $N$ の約数をすべて列挙しても50個にも満たないので、全部列挙することを考える。 その中で、移動回数は$i+j-2$回の最小の数が答えである。
解法
#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;
}