문제:
알고리즘의 킹갓제너럴엠퍼러마제스티충무공알고리즘마스터 현우가 교수로 취임하였다!
그러나 학생들에게 크나큰 기대를 품고 첫 수업에 들어갔던 현우는 아무도 외판원 순회 문제(Traveling Salesman Problem, TSP)를 풀지 못하는 것을 보고 낙심하였다.
그 와중에 학생 남규는 TSP를 완전탐색으로 풀려고 하였고, 현우는 그걸 보고 경악을 금치 못한다. 왜냐면 TSP를 완전탐색으로 풀려면 O(N!)의 시간이 소모되는데, 이는 경악을 금치 못할 시간이기 때문이다.
그러나 남규는 O(N!)이 왜 큰지도 잘 모른다. 그래서 현우는 더더욱 경악을 금치 못하고, N!이 얼마나 큰지 대략적으로나마 알려주기 위해, 자연수 N이 주어지면 N!의 오른쪽 끝에 있는 0의 개수를 알려주기로 하였다.
그러나 현우는 경악을 금치 못하여 지금 코딩을 할 수 없는 상황이다. 여러분이 현우를 대신하여 프로그램을 작성하시오.
입력:
첫째 줄에 테스트 케이스의 개수 T가 주어지고, 이어서 T개의 줄에 정수 N이 주어진다(1 <= N <= 1000000000).
출력:
각 줄마다 N!의 오른쪽 끝에 있는 0의 개수를 출력한다.
풀이방법:
오른쪽 끝에 0이 생기기 위해서는 2x5가 곱해져야 한다. 즉, N!을 소인수 분해 했을 때, 2와 5 중 더 작은 인수가 0의 갯수가 될 것이다. (2^P, 5^Q 일 때 P, Q 중 더 작은 수) 하지만 10까지만 봤을 때에도 2의 갯수가 압도적으로 많기 때문에 5의 개수만 알면 바로 0의 갯수를 알 수 있다. 따라서 5의 인수를 구하도록 한다.
1
2
3
4
5
6
7
8
9
10
|
T = int(input())
for _ in range(T):
n = int(input())
five = 5
ans = 0
while five <= n:
ans += n//five
five *= 5
print(ans)
|
cs |
문제링크:
https://www.acmicpc.net/problem/3474
'Algorithm > Python' 카테고리의 다른 글
[BOJ]12869.뮤탈리스크 (0) | 2022.08.02 |
---|---|
[BOJ]2852. NBA 농구 (0) | 2022.07.28 |
[BOJ]10709. 기상캐스터 (0) | 2022.07.21 |
[BOJ]2870. 수학숙제 (0) | 2022.07.19 |
[BOJ]11758. CCW (0) | 2022.07.14 |