문제:
이제 10 살이 된 헨리(Henry)는 수학에 소질이 있다. 수학선생님인 아메스(Ahmes)는 오늘 헨리에게 분수에 대해 가르쳐줬고, 헨리는 분수를 이리저리 계산해보는 것이 너무 재미있었다. 그러던 중에 헨리는 1 보다 작은 분수를 여러 개의 서로 다른 단위분수의 합으로 표현할 수 있다는 것을 알아내었다. 여기서 단위분수란 분자가 1 인 분수를 말한다. 헨리는 여러 개의 분수에 대해 이를 시도해봤고, 시도해본 분수들은 모두 서로 다른 단위분수의 합으로 표현할 수 있었다. 예를 들어, 은 와 같이 두 개의 단위 분수의 합으로 나타낼 수 있다.
헨리는 이런 발견을 선생님인 아메스에게 자랑스럽게 이야기했다. 아메스는 이를 듣고는 크게 기뻐하며 어린 제자를 칭찬했고, 이와 같이 하나의 분수를 서로 다른 단위분수의 합으로 표현한 것을 헨리식 표현법(Henry representation)이라고 이름 지었다. 즉, 분수 의 헨리식 표현법은 총합이 와 같게 되는 서로 다른 단위분수의 나열이다. 헨리와 아메스는 헨리식 표현법에 대하여 더욱 연구하였고, 마침내 모든 1 보다 작은 분수는 헨리식 표현법이 가능함을 증명하였다. 또한 헨리식 표현법이 유일하지 않다는 것도 알 수 있었다. 예를 들면, 와 같이 여러 가지 다른 헨리식 표현법이 존재할 수 있다. 단, 정의에 의해, 헨리식 표현법에는 같은 단위분수가 두 개 이상 포함될 수 없으므로 는 헨리식 표현법이 아님을 유념해야 한다.
아메스와 헨리는 또한 주어진 분수의 헨리식 표현법을 구하는 간단한 방법도 고안해냈다. 인 양의 정수 와 로 이루어진 분수 가 주어질 때에, 먼저 를 만족하는 가장 큰 단위 분수 를 계산한다. 그런 다음 에서 를 뺀 나머지에 대하여 위의 과정을 반복한다. 즉, 를 만족하는 가장 큰 단위분수 를 계산하고 뺀다. 이러한 과정을 나머지가 남지 않을 때까지 반복한다. 그러면 서로 다른 단위분수들 을 순서대로 얻게 되며 그들의 합은 정확히 와 같아진다. 아메스와 헨리는 이 알고리즘이 항상 종료하며 합이 가 되는 서로 다른 단위분수들, 즉 헨리식 표현법을 출력함을 증명하였다.
아메스와 헨리는 당신에게 그들의 알고리즘을 컴퓨터 프로그램으로 구현해줄 것을 부탁했다. 입력으로 주어지는 1 보다 작은 분수 를 아메스와 헨리의 알고리즘을 수행하여 헨리식 표현법을 계산할 때에 마지막 단위 분수의 분모를 출력하는 프로그램을 작성하시오. 예를 들어. 라면, 아메스와 헨리의 알고리즘은 을 출력하게 되므로 당신의 프로그램은 반드시 70 을 출력해야 한다.
입력:
출력:
출력은 표준출력을 사용한다. 각 테스트 데이터에 대해, 정확히 한 줄을 출력해야 하며 여기에는 정수 하나만을 출력한다. 이 정수는 아메스와 헨리의 알고리즘을 입력 분수 에 대해 실행했을 때, 출력되는 헨리식 표현법의 마지막 단위분수의 분모와 같아야 한다.
풀이 방법:
1 2 3 4 5 6 7 8 9 | from fractions import Fraction for i in range(int(input())): a,b=map(int,input().split()) while(a!=1): c=b//a+1 a=a*c-b b=b*c a,b=map(int,str(Fraction(a,b)).split('/')) print(b) | cs |
'Algorithm > Python' 카테고리의 다른 글
[BOJ]1015. 수열 정렬 (0) | 2019.05.16 |
---|---|
[BOJ]1547. 공 (0) | 2019.05.15 |
[BOJ]3036. 링 (0) | 2019.05.13 |
[BOJ]2591. 이항 쇼다운 (0) | 2019.05.12 |
[BOJ]2407. 조합 (0) | 2019.05.11 |