#문제
https://www.acmicpc.net/problem/2004
#작성 코드
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
|
#include <iostream>
using namespace std;
int main(){
int n, m;
int two=0, five=0;
// 입력
cin>>n>>m;
// N!
for(long long i=2; i<=n; i*=2)
two += n/i;
for(long long i=5; i<=n; i*=5)
five += n/i;
// M!
for(long long i=2; i<=m; i*=2)
two -= m/i;
for(long long i=5; i<=m; i*=5)
five -= m/i;
// (N-M)!
for(long long i=2; i<=n-m; i*=2)
two -= (n-m)/i;
for(long long i=5; i<=n-m; i*=5)
five -= (n-m)/i;
// 결과 출력
int result=min(two, five);
cout<<result<<'\n';
return 0;
}
|
cs |
##
nCm은 n! / ( m! * (n-m)! ) 이므로
n!에 포함된 2와 5의 개수 - m!에 포함된 2와 5의 개수 - (n-m)!에 포함된 2와 5의 개수 => min(2의 개수, 5의 개수) 가 nCm에 포함된 0의 개수이다.
n!에 i가 약수로 몇 개 들어있는가?
tmp = 2, ... , n으로 반복.
i개수 = i개수 + tmp/i;
i = i*i;
i<=n까지 반복한다.
ex) n=20일 경우, 2가 인수로 몇 개 들어있을까
i = 2 : 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 -> 10개
i = 4 : 4, 8, 12,16, 20 -> 5개
i = 8 : 8, 16 -> 2개
i = 16 : 16 -> 1개
총 18개 들어있다.
'BOJ' 카테고리의 다른 글
BOJ 11401번 :: 이항 계수 3 (0) | 2019.12.25 |
---|---|
BOJ 1920번 :: 수 찾기 (0) | 2019.12.25 |
BOJ 1676번 :: 팩토리얼 0의 개수 (0) | 2019.12.25 |
BOJ 1956번 :: 운동 (0) | 2019.12.25 |
BOJ 1629번 :: 곱셈 (0) | 2019.12.24 |