※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 2436번 문제인 공약수이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/2436 

 

2436번: 공약수

첫째 줄에 두 개의 자연수가 빈칸을 사이에 두고 주어진다. 첫 번째 수는 어떤 두 개의 자연수의 최대공약수이고, 두 번째 수는 그 자연수들의 최소공배수이다. 입력되는 두 자연수는 2 이상 100,0

www.acmicpc.net

어떤 두 양의 정수의 최대공약수가 g이고 최소공배수가 L이라 하자. 이 때 두 정수는 각각 g의 배수이므로 gX, gY와 같이 나타낼 수 있고(단 X와 Y는 서로소) L = gXY와 같이 나타낼 수 있다.

 

따라서 L/g를 서로소인 두 양의 정수로 나눌 때 두 정수의 합의 최솟값(=X+Y의 최솟값)을 갖는 X와 Y의 값을 구하고 그 값으로 원래의 두 정수 gX와 gY를 출력하는 것으로 문제를 해결할 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

int gcd(int x, int y) {
	if (y) return gcd(y, x % y);
	return x;
}

int A, B, AA, BB;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> A >> B;
	B /= A;
	for (int i = 1; i * i <= B; i++) {
		if (B % i) continue;
		int X = i, Y = B / i;
		if (gcd(X, Y) > 1) continue;

		AA = X, BB = Y;
	}

	cout << A * AA << ' ' << A * BB;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 7117 // C++] Sevens, twos and zeros  (0) 2024.01.04
[BOJ 1750 // C++] 서로소의 개수  (1) 2024.01.03
[BOJ 4108 // C++] 지뢰찾기  (1) 2024.01.01
[BOJ 2624 // C++] 동전 바꿔주기  (1) 2023.12.31
[BOJ 3077 // C++] 임진왜란  (0) 2023.12.30

+ Recent posts