< [C++/백준 2004번] 조합 0의 개수

프로그래밍 공부/백준 (C++)

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

Rocketbabydolls 2024. 10. 26. 14:21

 

 

 

조합 공식과 정수론을 이용해 해결하는 문제.

 

조합 공식은 nCr n! / (n-r!) r! 이다. 

 

그리고 10을 구성하는 소인수는 2 x 5 인데, 2와 5 소인수 중 개수가 작은 것이 0의 개수가 될 것이다. 

 

팩토리얼의 소인수를 구하는 방법은 

https://blog.naver.com/shalska1234/50087466089

 

계승(factorial, !)의 소인수분해!

계승 [階乘, factorial] 1부터 어떤 양의 정수 n까지의 정수를 모두 곱한 것을 말하며 n!로 나타낸다....

blog.naver.com

 

이 블로그 게시글을 참고했다. 

 

100! -> 100 / 2, 100 / 4, 100/ 8 , 100 / 16  , 100 / 32 , 100 / 64 의 값을 모두 더하면 2의 소인수 개수가 된다.

 

따라서 n! 의 2 소인수 개수 - (n!-r!) 의 2 소인수 개수 - r ! 의 2 소인수 개수 를 해주면 해당 조합의 2 소인수 개수가 나온다. 

5도 똑같은 방식으로 적용하여 계산하면 문제를 해결할 수 있다.

 

 

#include <iostream>
#include <cmath>
using namespace std;

long long d2(long long input)
{
	long long cnt = 0;
	for (long long i = 1; i <= input; i *= 2)
	{
		if (i > input) break;
		cnt += input / i;
	}
	return cnt;
	
}

long long d5(long long input)
{
	long long cnt = 0;
	for (long long  i = 1; i <= input; i *= 5)
	{
		if (i > input) break;
		cnt += input / i;
	}
	return cnt;
}


int main() {
	ios_base::sync_with_stdio(false), cin.tie(NULL);
	long long n, m;
	long long count = 0;
	cin >> n >> m;


	count = min(d5(n) - d5(m) - d5(n - m), d2(n) - d2(m) - d2(n - m));
	


	cout << count;
}