#문제

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

 

2004번: 조합 0의 개수

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

www.acmicpc.net

 

#작성 코드

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

+ Recent posts