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

 

이번에 볼 문제는 백준 26092번 문제인 수학적인 최소 공통 조상이다.
문제는 아래 링크를 확인하자.

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

 

두 정점 번호 xy가 가리키는 두 정점의 LCA(최소 공통 조상)는 xy의 공약수 중 하나가 될 것임은 쉽게 관찰할 수 있다. 이로부터, xy의 소인수 중 공약수에 포함될 수 없는 소인수가 모두 없어지기 전까지는 부모 정점으로 거슬러 올라가는 것을 반복해야 할 것임을 발견할 수 있다. 또한 각 정점에서 부모 정점으로 이동할 때 번호는 가장 작은 소인수부터 사라지므로, xy에 대하여 소인수 중 공약수에 포함되지 않는 최대의 소인수 '미만'의 모든 소인수는 지워야 함을 알 수 있다. 또한 공약수에 포함되지 않는 최대 소인수는 xy의 공약수에 포함된 개수만큼 남기고 나머지는 지워야 함을 알 수 있다.

 

위 과정에서 정점을 거슬러올라가는 총 횟수는 lgA+lgB  이하이므로 위와 같은 풀이를 통해 문제를 해결하자.

 

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

#include <iostream>
#include <utility>
using namespace std;
typedef long long ll;

ll A, B;

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

	cin >> A >> B;
	if (A < B) swap(A, B);
	for (ll i = 2; i < 1000001; i++) {
		if (A == B) {
			cout << A;
			return 0;
		}
		if (A % i == 0) A /= i;
		else if (B % i == 0) B /= i;
		else i++;
		i--;
		if (A < B) swap(A, B);
	}

	cout << 1;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 5479 // C++] Pyramid  (0) 2024.06.28
[BOJ 21375 // C++] Konamikoden  (0) 2024.06.27
[BOJ 12946 // C++] 육각 보드  (0) 2024.06.25
[BOJ 7587 // C++] Anagrams  (0) 2024.06.24
[BOJ 27738 // C++] 연산자 파티  (0) 2024.06.23

+ Recent posts