※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 11414번 문제인 LCM이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/11414
11414번: LCM
두 자연수 A, B가 주어졌을 때, A + N과 B + N의 최소공배수가 최소가 되는 자연수 N을 구하시오.
www.acmicpc.net
A+N과 B+N의 최소공배수는 두 수의 곱을 A+N과 B+N의 최대공약수로 나눈 것과 같다.
N에 상관없이 계산하기 위해 관찰을 해보면, gcd(A+N,B+N) = gcd(A+N, abs(A-B)) 라는 점을 발견할 수 있다.
위 식에 따라, gcd(A+N,B+N)은 abs(A-B)의 약수 K들일 수밖에 없다는 것을 알 수 있다.
A+N과 B+N의 최대공약수가 K가 되게끔 하는 N의 최솟값이 항상 존재하므로, 그러한 N을 찾아 abs(A-B)의 약수 K 각각에 대하여 답을 비교해나가는 것으로 문제를 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
vector<int> divisors;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int A, B; cin >> A >> B;
if (A == B) {
cout << 1;
return 0;
}
int diff = abs(A - B);
int i = 1;
for (; i * i < diff; i++) {
if (diff % i == 0) {
divisors.emplace_back(i);
divisors.emplace_back(diff / i);
}
}
ll val = 4000000000000000001LL;
int ans = 1000000001;
if (i * i == diff) divisors.emplace_back(i);
sort(divisors.begin(), divisors.end());
for (auto d : divisors) {
int r = A % d;
r = d - r;
ll AA = A + r, BB = B + r;
ll tmp = AA * (BB / d);
if (tmp < val) {
val = tmp;
ans = r;
}
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 14565 // C++] 역원(Inverse) 구하기 (0) | 2021.11.30 |
---|---|
[BOJ 10244 // C++] 최대공약수들 (0) | 2021.11.29 |
[BOJ 4779 // C++] 칸토어 집합 (0) | 2021.11.27 |
[BOJ 17829 // C++] 222-풀링 (0) | 2021.11.26 |
[BOJ 4386 // C++] 별자리 만들기 (0) | 2021.11.25 |