while(1) 작심삼일();

[백준 2004번] 조합 0의 개수 본문

CS/baekjoon

[백준 2004번] 조합 0의 개수

hanjongho 2021. 1. 31. 02:45

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

 

2004번: 조합 0의 개수

첫째 줄에 정수 $n$, $m$ ($0 \le m \le n \le 2,000,000,000$, $n \ne 0$)이 들어온다.

www.acmicpc.net

풀이) 

1676(팩토리얼 0의 개수)의 문제에 조합개념이 추가된 문제이다. 결국 0의 개수는 (2, 5)가 몇쌍있는지 갯수를 구하면 답이 된다. 그렇기 때문에 nCm 조합개념을 적용하여 2와 5의 개수를 세고 둘 중 적은 것이 0의 개수가 된다.

#include <iostream>
using namespace std;

int ans(int n, int x)
{
    int ans = 0;

    for (long long i = x; i <= n; i *= x)
        ans += n / i;
    return ans;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int n, m, two = 0, five = 0;

    cin >> n >> m;
    two = ans(n, 2) - ans(n - m, 2) - ans(m, 2);
    five = ans(n, 5) - ans(n - m, 5) - ans(m, 5);
    cout << min(two, five);
    return (0);
}

 

 

제 코드는 절대 완벽하지 않습니다

더 좋은 풀이방법 혹은 코드에 관한 질문이 있으시면 언제든 댓글주세요!

Comments