반응형
https://www.acmicpc.net/problem/2004
혼자 힘으로 풀었는가? X
알고리즘 분류
- 수학
- 정수론
문제
0의 개수를 출력하는 프로그램을 작성하시오.
의 끝자리입력
첫째 줄에 정수 , (0≤$m$≤$n$≤2,000,000,000 , $n$≠0)이 들어온다.
출력
첫째 줄에 의 끝자리 0의 개수를 출력한다.
처음엔 단순히 팩토리얼로 해봤는데 20억의 숫자는 당연히 불가능했다.
팩토리얼이 아닌 다른 방식으로 풀어야 함을 금방 깨달았다.
이내 발견한 방법이
5와 0의 개수만큼 0의 개수가 추가되며 5의 제곱수만큼이 또 더해진다는 것을 알게 되었다.
5! = 1개
10! = 2개
15! = 3개
...
25! = 6개 ($5^2%)
50! = 12개
75! = 18개
그래서 처음엔
import sys
input = sys.stdin.readline
import math
n, m = map(int, input().split())
def div(value):
total = 0
five = 5
i = 1
while five <= value:
total += value // five
i += 1
five = 5**i
return total
a = div(n)
b = div(n-m)
c = div(m)
print(a-b-c)
위와 같이 풀었다.
각 0의 개수를 구해서 빼주면 되는것이엇다.
하지만 틀렸다.
그래서 질문게시판의 반례를 보다가 '5 1'이 입력되면 0이라는 것을 알게 되었다.
즉 5의 개수만 세는 것이 아닌 2의 개수도 같이 세주어 더 작은 수의 개수로 출력하는 문제였던 것이다.
import sys
input = sys.stdin.readline
import math
n, m = map(int, input().split())
def div_five(value):
total = 0
five = 5
i = 1
while five <= value:
total += value // five
i += 1
five = 5**i
return total
def div_two(value):
total = 0
two = 2
i = 1
while two <= value:
total += value // two
i += 1
two = 2**i
return total
a = div_five(n)
b = div_five(n-m)
c = div_five(m)
d = div_two(n)
e = div_two(n-m)
f = div_two(m)
print(min(a-b-c, d-e-f))
어려운 문제였다... 실버 2문제에서 계속해서 너무 헤매게 된다.
반응형
'Algorithm > 백준' 카테고리의 다른 글
[Python] 백준 5397번 - 키로거 (실버2) (0) | 2023.08.06 |
---|---|
[Python] 백준 10971번 - 외판원 순회 2 (실버2) (0) | 2023.08.05 |
[Python] 백준 11048번 - 이동하기 (실버2) (0) | 2023.08.03 |
[Python] 백준 9184번 - 신나는 함수 실행(실버2) (0) | 2023.08.02 |
[Python] 백준 10819번 - 차이를 최대로(실버2) (0) | 2023.08.01 |
댓글