Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- BOJ #컴퓨터공학 #C++ #알고리즘 #자료구조
- 컴퓨터공학 #Java #자바 #클래스 #객체 #인스턴스
- 잔
- 컴퓨터공학 #자료구조 #스택 #c++ #알고리즘 #백준문제풀이
- 컴퓨터공학 #c #c언어 #문자열입력
- HTML #CSS
Archives
- Today
- Total
영벨롭 개발 일지
[백준 BOJ][C++]2004번: 조합 0의 개수 풀이 본문
https://www.acmicpc.net/problem/2004
문제 풀이에 앞서 1676번 풀이 글을 보고 오시면 도움이 됩니다.
n, m에 대한 조합 공식은 n!/(m!(n-m)!) 입니다.
1676번 팩토리얼 0의 개수를 구할 때에는 5의 개수를 알면 0의 개수를 알 수 있었습니다.
하지만 조합 0의 개수를 구할 때에는 5의 개수 뿐만 아니라 2의 개수도 고려해야 합니다.
만약 n이 6, m이 2일 때를 봅시다.
6!의 5의 개수는 1개이고 2!과 3!의 5의 개수는 0개입니다. 5의 개수만 고려한다면 조합 0의 개수는 1개가 되겠지요. 하지만 실제로 계산해보면 15입니다. 0의 개수가 0개입니다. 10을 만들기 위해 필요한 2가 상쇄되었기 때문입니다.
따라서 각 팩토리얼의 5의 개수와 2의 개수를 따져서 총 5의 개수와 2의 개수 중 더 작은 값이 답이 됩니다.
#include<iostream>
using namespace std;
long long funct(int n, int k) {
long long ans = 0;
for (long long i = k; i <= n; i *= k) {
ans += n / i;
}
return ans;
}
int main(void) {
cin.tie(NULL);
cout.tie(NULL);
ios_base::sync_with_stdio(false);
int n, m;
long long num2, num5;
long long ans;
cin >> n >> m;
num2 = funct(n, 2) - (funct(m, 2) + funct(n - m, 2));
num5 = funct(n, 5) - (funct(m, 5) + funct(n - m, 5));
if (num2 < num5)
ans = num2;
else
ans = num5;
cout << ans;
return 0;
}
반응형
'알고리즘 문제 풀이 > BOJ' 카테고리의 다른 글
[백준 BOJ][C++]9095번 1, 2, 3 더하기 풀이: DP (0) | 2022.02.24 |
---|---|
[백준 BOJ][C++]1463번 1로 만들기: DP (0) | 2022.02.24 |
[백준 BOJ][C++]1676번: 팩토리얼 0의 개수 풀이 (0) | 2022.02.22 |
[백준 BOJ][C++]2609번 최대공약수와 최소공배수 구하기: 유클리드 호제법 (0) | 2022.02.21 |
[백준 BOJ][C++]10799번 쇠막대기 풀이: Stack (0) | 2022.02.17 |