조합을 계산할 때에는 보통 다음의 식을 사용합니다.
뒤의 0의 개수를 구할 때에는 10의 배수가 몇개나 생기는 가가 중요합니다. 그렇기 때문에 2의 소인수의 개수와 5의 소인수의 개수가 몇개인 가가 중요하게 됩니다. 일반적으로는 2의 소인수의 개수가 더 많지만, 꼭 그렇지는 않습니다.

이 방법을 이용해서 2의 소인수의 개수와 5의 소인수의 개수를 구한 후에 둘 중 소인수의 수가 적은 것이 조합에서 뒤에 나오는 연속된 0의 개수가 됩니다.
제가 작성한 소스입니다
//------------------------------------------------
// baekjoon #2004 - Trailing Zeros Counting of Combination
// - by Aubrey Choi
// - created at 2019-06-27
//------------------------------------------------
#include <stdio.h>
int main()
{
int n, k, t, f = 0, s = 0;
scanf("%d%d", &n, &k);
t = n/5; while(t) { f += t; t /= 5; }
t = (n - k) / 5; while(t) { f -= t; t /= 5; }
t = k/5; while(t) { f -= t; t /= 5; }
t = n / 2; while(t) { s += t; t /= 2; }
t = (n - k) / 2; while(t) { s -= t; t /= 2; }
t = k / 2; while(t) { s -= t; t /= 2; }
printf("%d\n", f<s?f:s);
}
반응형
'Programming > BOJ' 카테고리의 다른 글
[C/C++] 백준 #2014 소수의 곱(우선 순위 큐) (0) | 2023.01.17 |
---|---|
[C/C++] 백준 #2011 암호코드(동적 계획법) (0) | 2023.01.15 |
[C/C++] 백준 #2003 수들의 합 2(두개의 포인터) (0) | 2023.01.14 |
[C/C++] 백준 #1991 트리순회(깊이 우선 탐색) (0) | 2023.01.13 |
[C/C++] 백준 #1987 알파벳(깊이 우선 탐색) (2) | 2023.01.12 |
댓글