https://www.acmicpc.net/problem/2004

 

2004번: 조합 0의 개수

첫째 줄에 정수 $n$, $m$ ($0 \le m \le n \le 2,000,000,000$, $n \ne 0$)이 들어온다.

www.acmicpc.net


 
a,b = map(int,input().split())

def count_two(N):
     two=0
     while N!=0:
          N//=2
          two +=N
     return two

def count_five(N):
     five=0
     while N!=0:
          N//=5
          five+=N
     return five


two = count_two(a)-count_two(a-b)-count_two(b)
five = count_five(a)-count_five(a-b)-count_five(b)

print(min(two,five))
 

막무가내로 풀면 무조건 시간초과 메모리초과가 난다.

쓸수있는 방법을 다 써보다 안돼서 앞서 1676번에서 봤던 깔끔한 코드를 이용해보기로 했다.

 

https://playedenough.tistory.com/55?category=1050629 

 

1676 - 백준

https://www.acmicpc.net/problem/1676 1676번: 팩토리얼 0의 개수 N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오. www.acmicpc.net import sys from math imp..

playedenough.tistory.com

 

간단하게 설명을 하자면,

만약 어떤 수 N이 0을 포함하고 있다면 그 형태는 반드시

10^N X A 일것이다.

근데 10^N을 인수분해하게 되면 2^N X 5^N 의 형태이다. 그런데 A안에도 2나 5가 포함 되어질 수도 있어서

2^N X 5^N X A 의 형태가 2^N X 5^(N+K) X A 혹은 2^(N+K) X 5^N X A 의 형태로 나타내 질 수도 있다.   

예를들어서

1320 = 13200 = 132 X 10^2 = 132 X (2^2 X 5^2) 형태를 띄게 된다.

근데 여기서 132을 인수분해하면 132 = 66 X 2 = 33 X 2 X 2 = 3 X 2^2 X 11 이므로

최종적으로는 3 X 11 X (2^4 X 5^2) 형태를 띄게 된다.

그렇기에 우리는 2와 5의 지수중에 최소값을 선택하면 그게 곧 10의 개수이고 이는 곧 0의 개수라고 생각할 수 있다.

13200 = 3 X 11 X (2^4 X 5^2) -> min(2의지수,5의지수) = 2 13200 에서 0의 개수는 2개.

 

 

이를 생각해냈다면 그 다음부터는 단순히 nCr 조합 공식을 사용하면된다.

nCr 공식

예를들어서

25C12 를 구한다고하면

25! / (25-12)! * 12! 이다.

25 ! = ( 1 x 2 x 3 x 4 x ....... 21 x 22 x 23 x 24 x 25) 

(25-12) ! = (1 x 2 x ................ x 11 x 12 x 13)

12 ! = ( 1 x 2 x ....................... x 11 x 12)

이다.

2와 5의 개수는 def count를 통해서 쉽게 알 수 있다.

근데 여기서 주의해야할게 100! 과 같은 경우에 5의 개수를 구해보면

5의 배수에서 하나씩  (5,10,15....100) 총 20개

5^2의 배수에서는 하나씩 더  (25, 50, 75,100) 총 4개를 더 가지고 있다.

숫자가 더 커지게 되어서 5^n의 배수일때도 고려해줘야 된다.

n!에서 5의 지수승의 총합 = n/5 + n/25 + n/75 + ...... 이런 형태를 띄게된다.

이는 2의 배수에서도 마찬 가지임을 주의해야한다.

 

또 여기서 a-(a-b)-b 를 하는 이유는 나누기 때문이다.

엄밀히 말하면 (a-{(a-b)+b)} 이다. 

예를들어서 120/2x12를 한다고 하면 에서 2의 개수는

120 / 24 = 5

120 = 12 x 10 = 2^2 x 3 x 2 x 5 = 2^3 x 3 x 5

2x12 = 2^1 x 2^2 x 3 = 2^3 x 3

2^3 x 3 x 5 / 2^3 x 3 

= 5

2^2 / 2 = 2^2-1 = 2^1 이렇게 나타낼 수 있으니까라고 생각하면 된다.

 

 

 

 

 

 

 

'취준 > 백준' 카테고리의 다른 글

18352 - 파이썬  (0) 2022.07.07
2178 - 파이썬  (0) 2022.07.05
1676 - 백준  (0) 2022.05.11
9375 - 파이썬  (0) 2022.05.09
11051 - 파이썬  (0) 2022.05.06

+ Recent posts