백준 1484 다이어트

Caden·2023년 8월 29일
0

백준

목록 보기
6/20

나는 이 문제를 수학적으로 접근했다.
A = 이전 몸무게, B = 현재 몸무게라고 할 때,
B^2 - A^2 = G를 만족하면 된다.
위 식을 정리하면,
(B - A)(B + A) = G를 만족하고 우변이 자연수이고 BA는 정수이고 (B + A) > 0를 만족한다.
따라서 (B - A) > 0이고 B > A라는 식을 얻을 수 있다.
B - A = X, B + A = Y라고 가정하면, XY는 자연수이고 동시에 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';
}

0개의 댓글