<문제 풀이>
n과 m이 20억까지의 수를 가지고 있어서 O(N)만으로도 시간초과가 날 수 밖에 없다.
따라서 수학적인 방법으로 해결하여야 한다.
끝의 0의 개수를 세기 위해 1과 10을 제외한 10의 약수인
5의 개수와 2의 개수를 세어 둘 중 작은 수를 가진 것이 끝의 0의 자리 숫자가 된다.
<정답 코드>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include <iostream> using namespace std; int n, m; int cnt5, cnt2; int main() { cin >> n >> m; for (long long i = 5; i <= n; i *= 5) cnt5 += n / i; for (long long i = 5; i <= n - m; i *= 5) cnt5 -= (n - m) / i; for (long long i = 5; i <= m; i *= 5) cnt5 -= m / i; for (long long i = 2; i <= n; i *= 2) cnt2 += n / i; for (long long i = 2; i <= n - m; i *= 2) cnt2 -= (n - m) / i; for (long long i = 2; i <= m; i *= 2) cnt2 -= m / i; if (cnt5 >= cnt2) cout << cnt2; else cout << cnt5; return 0; } | cs |
'C++ 문제풀이' 카테고리의 다른 글
| 1987번 백준(Baekjoon) (0) | 2018.10.16 |
|---|---|
| 2457번 백준(Baekjoon) (0) | 2018.10.12 |
| 1068번 백준(Baekjoon) (0) | 2018.10.04 |
| 1149번 백준(Baekjoon) (0) | 2018.10.04 |
| 2579번 백준(Baekjoon) (0) | 2018.10.02 |