BOJ

백준 2004 - 조합 0의 개수

yanJuicy 2020. 2. 18. 16:06
반응형

문제

 

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

 

2004번: 조합 0의 개수

첫째 줄에 정수 n, m(0≤m≤n≤2,000,000,000, n!=0)이 들어온다.

www.acmicpc.net

 

 

풀이

 

10의 배수들이 끝자리가 0이 된다. 10은 2x5로 이루어진다. 따라서 조합의 결과 값에서 2와 5의 개수를 구하면 된다. 2와 5의 각 개수 중 적은 값이 만들 수 있는 0의 수가 된다. nCm = n! / (m! * (n-m)!) 이므로 nCm을 한 이후에 2와 5의 개수를 구하면은 시간초과가 발생한다. 따라서 각각을 따로 구한다.

1. n!에서 2, 5의 개수

2. m!에서 2, 5의 개수

3. (n-m)!에서 2, 5의 개수

 

1번에서 2, 3번에 대해 각각 뺄셈을 진행한 후에 2와 5의 개수 중 최소값이 끝자리 0의 개수가 된다.

 

n!에서 2의 개수(or 5의 개수)를 구하는 빠른 방법은 2(or 5)^i (i=1, 2, 3, ...)로 나눈 몫이 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
32
33
34
#include <iostream>
 
using namespace std;
 
int n, m;
 
long long get(int a, int b)
{
    long long r = 0;
    long long d = b;
    while (a / d)
    {
        r += a / d;
        d *= b;
    }
    return r;
}
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(0);
 
    cin >> n >> m;
 
    int k = n - m;
 
    long long two = get(n, 2- get(m, 2- get(k, 2);
    long long five = get(n, 5- get(m, 5- get(k, 5);
 
    cout << (two < five ? two : five);
 
    return 0;
}
cs

 

반응형

'BOJ' 카테고리의 다른 글

백준 1932 - 정수 삼각형  (0) 2020.02.28
백준 1874 - 스택 수열  (0) 2020.02.24
백준 6588 - 골드바흐의 추측  (0) 2020.02.12
백준 2346 - 풍선 터뜨리기  (0) 2020.01.25
백준 1753 - 최단경로  (1) 2020.01.10