sm 기술 블로그

116. 2004(조합 0의 개수) 본문

문제/백준_파이썬

116. 2004(조합 0의 개수)

sm_hope 2022. 6. 27. 22:12
import sys
input = sys.stdin.readline

n, m = map(int, input().split())


def fiveCnt(x):
    cnt = 0
    while x >= 5:
        cnt += x//5
        x //= 5
    return cnt


def twoCnt(x):
    cnt = 0
    while x >= 2:
        cnt += x//2
        x //= 2
    return cnt


print(min(fiveCnt(n)-fiveCnt(n-m)-fiveCnt(m), twoCnt(n)-twoCnt(n-m)-twoCnt(m)))

문제요약

이항계수를 구한 값에서 뒤부터 0이 아닌 숫자가 나올 때까지 0은 몇번 나오는가?

설명

이 문제는 조합을 먼저 구하고 할 수 없다.

조건이

최대 입력값이 20억이기 때문에 규칙을 찾아야 한다.

이항계수는 다음과 같이 식을 표현 할 수 있다.

 

뒤에 0이 나오는 경우는 2 * 5를 가지고 있는 수이며, 2가 a승 5가 b 승일 때 a와 b 중 더 작은 값이 0의 개수이다.

 

따라서 n!과 n-r!과 r!의 2의 승수, 5의 승수를 구하고, 각 값들을 빼준다.

그리고 그 값에서 2의 승수, 5의 승수 중 더 작은 값이 0의 개수가 된다.

 

 승수를 빼주는 이유는

 다음과 같기 때문이다.

'문제 > 백준_파이썬' 카테고리의 다른 글

118. 15650(N과M (2))  (0) 2022.06.29
117. 15649( N과M(1) )  (0) 2022.06.28
115. 1676(팩토리얼 0의 개수)  (0) 2022.06.27
114. 9375 (패션왕 신해빈)  (0) 2022.06.27
113. 1010 (다리놓기)  (0) 2022.06.26
Comments