주어진 조건을 만족하는 네 양의 정수 (a, b, c, d) 쌍의 개수가 정확히 59개가 되는 가장 작은 자연수 m과 가장 큰 자연수 M을 찾고, 그 합 M + m을 구하는 문제.
조건:
(a^(1/b)) * (c^(1/d)) = 24^(1/5)
해당 문제는 수치 비교에서 실수 오차가 발생할 수 있기 때문에, 정확한 수 비교를 위해 로그를 이용한 비교로 전환했다.
변형 수식:
log(a^(1/b)) + log(c^(1/d)) = log(24^(1/5))
⇒ (1/b) * log(a) + (1/d) * log(c) = log(24)/5
이 식을 기반으로 실수 비교를 수행함.
k의 범위를 2부터 200까지 순차적으로 증가시키며 검사a, b, c, d를 각각 [2, k], [1, k] 범위로 완전 탐색log(24)/5와의 차가 epsilon보다 작을 경우 조건 만족으로 판단Set<String>에 저장해 중복 제거count == 59일 때의 최소 k와 최대 k를 저장M + m 출력for (int k = 2; k <= 200; k++) {
Set<String> seen = new HashSet<>();
int count = 0;
for (int a = 2; a <= k; a++) {
for (int b = 1; b <= k; b++) {
for (int c = 2; c <= k; c++) {
for (int d = 1; d <= k; d++) {
double lhs = Math.log(a) / b + Math.log(c) / d;
if (Math.abs(lhs - target) < epsilon) {
seen.add(a + "," + b + "," + c + "," + d);
count++;
}
}
}
}
}
if (count == 59) {
if (minK == 0) minK = k;
maxK = k;
}
}
Math.abs(lhs - target) < epsilon 조건 활용a, c는 2 이상부터 시작 (1이면 의미 없는 조합이 되므로)정확히 k = 72와 k = 80에서 59개의 조합이 존재함을 확인했고, 최종 결과는:
M + m = 152
에...?