조합 0의 개수 //2004

김동완·2022년 8월 3일
0

BAEKJOON

목록 보기
27/53
  • 문제 
    (nm)n \choose m의 끝자리 00의 개수를 출력하는 프로그램을 작성하시오.

    //시간 제한: 2초, 메모리 제한: 128MB
  • 입력
    첫째 줄에 정수 nn, mm (0mn2,000,000,0000 \le m \le n \le 2,000,000,000, n0n \ne 0)이 들어온다.
  • 출력
    첫째 줄에 (nm)n \choose m의 끝자리 00의 개수를 출력한다.

// Created by dongwan-kim on 2022/07/30.
#include<iostream>

using namespace std;

long long int n, m, nFiveCnt, nmFiveCnt, mFiveCnt, nTwoCnt, nmTwoCnt, mTwoCnt, a, b;;

long long int FiveCnt(long long int o, long long int k) {
    long long int cnt = 0;
    cnt = o / k;
    return cnt;
}

long long int TwoCnt(long long int o, long long int k) {
    long long int cnt = 0;
    cnt = o / k;
    return cnt;
}


int main() {

    cin >> n >> m;


    if (m == 0) {
        cout << 0;
        return 0;
    }

    for (long long int i = 2; i <= n; i *= 2) {
        nTwoCnt += TwoCnt(n, i);
    }
    for (long long int i = 5; i <= n; i *= 5) {
        nFiveCnt += FiveCnt(n, i);
    }

    for (long long int i = 2; i <= n - m; i *= 2) {
        nmTwoCnt += TwoCnt(n - m, i);
    }
    for (long long int i = 5; i <= n - m; i *= 5) {
        nmFiveCnt += FiveCnt(n - m, i);
    }

    for (long long int i = 2; i <= m; i *= 2) {
        mTwoCnt += TwoCnt(m, i);
    }
    for (long long int i = 5; i <= m; i *= 5) {
        mFiveCnt += FiveCnt(m, i);
    }

    a = nTwoCnt - nmTwoCnt - mTwoCnt;
    b = nFiveCnt - nmFiveCnt - mFiveCnt;

    if (a <= b)
        cout << a;
    else
        cout << b;
}

풀이

profile
KIM DONGWAN

0개의 댓글