백준 2004 조합 0의 개수

2020. 2. 20. 17:08Algorithm/문제풀이

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

 

2004번: 조합 0의 개수

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

www.acmicpc.net

백준 2004 조합 0의 개수는 조합의 결과가 제일 뒤 0의 개수가 몇개가 나오는지 확인하는 문제이다. 1676번 팩토리얼의 0의 개수와 같듯이 2, 5의 등장횟수를 구한 뒤 적은 등장 횟수가 답이된다. 왜냐하면 2*5가 한개씩 있으면 10이되고 두개씩 있으면 100이되면서 뒤의 숫자들은 2와 5의 개수로 결졍된다. 

 

 

 

조합은 아래와 같은 공식을 따른다. 

그래서 우리는 n!, (n-r)!, r!에 5와 2가 몇번 등장해야하는지 확인해야한다.

 

예를 들어 25!이면 1 부터 25까지의 곱셈을 의미한다.

 

그럼 5의 등장 횟수는  

5, 10, 15, 20, 25

 

25는 5^2임으로 총 6번 등장한다. 이럿듯 결국 5로 나누어주고 25로 나누어 주어서 횟수를 구하면 된다(5의 제곱승). 분모의 경우도 동일하게 n-r의 등장 횟수 r의 등장횟수를 더한 다음 n의 등장횟수에서 빼주면 조합결과에서 5의 등장횟수가 된다. 2도 마찬가지로 위와 같은 방법으로 2의 등장횟수를 구한 후 더 등장횟수가 적은 값이 0의 등장횟수가 된다. 

 

코드

더보기
#include <cstdio>
#include <algorithm>

using namespace std;

long long M, N;

long long divide5(long long number);
long long divide2(long long number);

int main(){
	scanf("%lld %lld", &N, &M);
	printf("%lld", min( divide5(N) - (divide5(M) + divide5(N-M)), divide2(N) - (divide2(M) + divide2(N-M))));
}

long long divide5(long long number){
	long long appendix = 0;
	for(long long i = 5; i <= number; i=i*5)
		appendix+=number/i;
	return appendix;
}
long long divide2(long long number){
	long long appendix = 0;
	for(long long i = 2; i <= number; i=i*2)
		appendix+=number/i;
	return appendix;
}

 

 

 

'Algorithm > 문제풀이' 카테고리의 다른 글

백준 그래프 1697번 숨박꼭질  (0) 2020.03.17
1629번 곱셈  (0) 2020.02.20
dp 백준 9251 LCS  (0) 2020.02.02
dp 백준 11053, 11054 가장 긴 증가하는 부분 수열  (0) 2020.02.01
dp 백준 2156 포도주 시식  (0) 2020.02.01