쿠폰

난이도

Gold 5

인증

문제

신기한 마이마이의 치킨박스 하나를 사면 1부터 N까지의 숫자 중 하나가 적힌 쿠폰 한 개를 준다.

해빈이는 골드치즈치킨을 매우 좋아한다. 1부터 N까지의 쿠폰들을 모두 모아야 골드치즈치킨 하나를 주문할 수 있다고 할 때, 해빈이는 신기한 마이마이의 치킨박스를 평균적으로 얼마나 많이 주문해야 하는가?

입력

쿠폰에 적힐 숫자의 범위(1 ≤ N ≤ 22)가 여러 줄에 걸쳐서 주어진다.

출력

각 입력에 대해 해빈이가 주문해야할 치킨박스의 수를 출력한다. 만약 답이 정수라면 그대로 출력한다. 답이 정수가 아니라면 정수부분을 출력하고, 공백하나를 출력한 다음, 아래에 보인 형식대로 적절히 정수를 뺀 나머지 값을 기약분수를 출력한다. 불필요한 공백은 출력하지 않는다.

예제 입력

2
5
17

예제 출력

3 
   5
11 --
   12
   340463
58 ------
   720720

해설 및 후기

통계적 수식을 사용해야 한다. 이와 같은 상황에서 평균적으로 주문해야 하는 횟수는 n*(1/n + 1/(n-1) … + 1/1)로 구할 수 있다. 때문에 이를 기약분수로 변환하는 것이 중요한데, GCD를 사용해 구한 분자와 분모를 나누어 기약분수 꼴로 만들어낼 수 있었다.

제출 코드

from math import gcd

def printAns(n):
    d = 1
    for i in range(2,n+1):
        d *= i
    t = 0
    for i in range(1,n+1):
        t += d//i
    t *= n
    c = gcd(t,d)
    d = d//c
    t = t//c
    if(t%d == 0):
        print(t//d)
    else:
        if(t//d < 10):
            print("  "+str(t%d))
            print(str(t//d)+" ",end='')
            for i in range(len(str(d))):
                print('-',end='')
            print()
            print(" ",str(d))
        else:
            print("   "+str(t%d))
            print(str(t//d)+" ",end='')
            for i in range(len(str(d))):
                print('-',end='')
            print()
            print("  ",str(d))

while(True):
    try:
        n = int(input())
        printAns(n)
    except:
        break