나는 이 문제를 수학적으로 접근했다.
A = 이전 몸무게
, B = 현재 몸무게
라고 할 때,
B^2 - A^2 = G
를 만족하면 된다.
위 식을 정리하면,
(B - A)(B + A) = G
를 만족하고 우변이 자연수이고 B
와 A
는 정수이고 (B + A) > 0
를 만족한다.
따라서 (B - A) > 0
이고 B > A
라는 식을 얻을 수 있다.
B - A = X
, B + A = Y
라고 가정하면, X
와 Y
는 자연수이고 동시에 G
의 약수이다.
또한 위 식을 더하면 B = (X + Y) / 2
가 나오고 따라서 X + Y
는 짝수이다.
위에서 얻은 정보를 코드로 구현하면 다음과 같다.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int g;
cin >> g;
vector<int> divisors;
for (int i = 1; i*i <= g; ++i) {
if (g % i == 0) {
divisors.push_back(i);
if (i*i != g) divisors.push_back(g/i);
}
}
sort(divisors.begin(), divisors.end());
int l = divisors.size();
vector<int> ans;
for (int i = 0; i < l/2; ++i) {
int tmp = divisors[i] + divisors[l-1-i];
if (tmp & 1) continue;
ans.push_back(tmp/2);
}
if (ans.empty()) {
cout << -1;
return 0;
}
reverse(ans.begin(), ans.end());
for (auto& e : ans) cout << e << '\n';
}