Algorithm/baekjoon
[BOJ 1676] 팩토리얼 0의 개수
식빵민
2022. 7. 31. 22:34
1676번: 팩토리얼 0의 개수
N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
문제 분석
- 뒷 자리에 0이 생기려면 10이 곱해져야 한다.(10 = 2 x 5)
- n부터 n보다 작은 수 중에 2ⁱ 의 배수의 개수를 센다.( i 는 1부터 2ⁱ ≤ n 일때 까지)
- n부터 n보다 작은 수 중에 5ⁱ 의 배수의 개수를 센다.( i 는 1부터 5ⁱ ≤ n 일때 까지)
풀이 과정
- 2ⁱ 의 배수의 개수와 5ⁱ 의 배수의 개수 를 구해 더 작은 것을 출력한다.
- 이를 구하는 방식은 2004번 문제 "조합 0의 개수"를 풀 때와 같은 논리다.
- https://genius00hwan.tistory.com/76
[BOJ 2004] 조합 0의 개수
2004번: 조합 0의 개수 첫째 줄에 정수 $n$, $m$ ($0 \le m \le n \le 2,000,000,000$, $n \ne 0$)이 들어온다. www.acmicpc.net 문제 분석 제한 시간 2초 : Big-O기준 약 2억 연산 입력되는 정수 최댓값 : 20억..
genius00hwan.tistory.com
#include <iostream>
using namespace std;
int n, cnt2, cnt5;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 2; i <= n; i *= 2) {
cnt2 += n / i;
}
for (int i = 5; i <= n; i *= 5) {
cnt5 += n / i;
}
cnt2 < cnt5 ? cout << cnt2 : cout << cnt5;
}
느낀 점
- 이미 풀어본 문제와 비슷한 문제를 풀때는 힐링을 하는 것 같다 ㅎㅎ ( 더 쉬운 문제라면 더더욱)
- 또, 내가 공부를 하긴 했구나 하는 뿌듯함을 느끼며 문제를 풀게된다.
- 이 문제를 풀며 2004번 문제를 풀때 써먹었던 논리를 머릿속에 확실히 넣게 된거 같다.
시간 복잡도
- 2ⁱ 의 배수의 개수 구하기 : O(log₂n) -> O(logn)
- 5ⁱ 의 배수의 개수 구하기 : O(log₅n) -> O(logn)
➣O(logn)