백준 문제풀이/실버2

백준 2004번 - 조합 0의 개수

void_melody 2022. 8. 3. 11:56

https://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

조합의 공식이

n! / m! * (n-m)! 이다.

여기서 끝자리 0이라는 이야기는 10이 곱해졌다는 소리이고

10을 만드는 것은 2와 5이다.

그렇기에 2와 5의 갯수를 통해 10의 갯수를 유추할 수 있다.

물론 10이 되려면 2와 5가 둘 다 필요하니 이 둘 중 최소 갯수를 출력해주면 된다.

m과 n의 범위가 크기에 long long으로 처리했다.

추가적으로 예를 들어 25의 경우 5가 두 개나 된다.

그렇기에 단순히 if(%5 == 0) 해서 five++를 해서는 안된다.

몫 연산자를 활용해서 갯수만큼 더해주었다.

#include <bits/stdc++.h>
using namespace std;

#define ll long long
pair<ll, ll> count_two_five(int a)
{
	ll two = 0, five = 0;
	
	for (ll i = 2; i <= a; i *= 2)
		two += (a / i);

	for (ll i = 5; i <= a; i *= 5)
		five += (a / i);
	

	return make_pair(two, five);
}

int main()
{
	ll n, m;
	cin >> n >> m;

	pair<ll, ll> n_fac = count_two_five(n);
	pair<ll, ll> m_fac = count_two_five(m);
	pair<ll, ll> n_m_fac = count_two_five(n - m);

	ll a = n_fac.first - (m_fac.first + n_m_fac.first);
	ll b = n_fac.second - (m_fac.second + n_m_fac.second);

	cout << min(a, b);

	return 0;
}