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;
}
|