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!에서 2와 5의 개수(1)와 k!과 (n-k)!에서 2와 5의 개수(2)를 구하면 0의 개수를 알 수 있다.
(1) - (2)를 한 뒤, 2의 개수와 5의 개수 중 작은 쪽의 개수가 0의 개수이다.
원하는 수가 몇번 나왔는지 구하는 cnt 함수를 작성한다.
10!에서 2의 개수를 구해보자.
10/2 = 5개 - 2,4,6,8,10 (2^1)
5/2 = 2개 - 4, 8 (2^2)
2/2 = 1개 - 8 (2^3)
(2의 배수를 카운팅)
#include<string>
#include<iostream>
using namespace std;
int cnt(int n, int r) {
int count = 0;
while (n) {
n /= r;
count += n;
}
return count;
}
int main() {
unsigned long int n, m;
cin >> n >> m;
//2랑 5가 짝지어지는 횟수가 0의 개수
int n_two = cnt(n, 2);
int n_five = cnt(n, 5);
int nm_two = cnt(n - m, 2);
int nm_five = cnt(n - m, 5);
int m_two = cnt(m, 2);
int m_five = cnt(m, 5);
int two = n_two - (nm_two + m_two);
int five = n_five - (nm_five + m_five);
if (two <= 0 || five <= 0) {
cout << 0;
}
else if (two >= five) {
cout << five;
}
else if (two <= five) {
cout << two;
}
return 0;
}
'Study > 백준' 카테고리의 다른 글
[백준] 11724번: 트리의 부모 찾기(C++) (0) | 2022.04.10 |
---|---|
[백준] 1676번: 팩토리얼 0의 개수 (0) | 2022.03.30 |
[백준] 1158번: 요세푸스 문제 (0) | 2022.03.29 |
[백준] 10799번: 쇠막대기 (C++) (0) | 2022.03.29 |
[백준] 4949번: 균형잡힌 세상 (C++) (0) | 2022.03.25 |