https://www.acmicpc.net/problem/2004
(정답률 28.726%)
의 끝자리 의 개수를 출력하는 프로그램을 작성하시오.
첫째 줄에 정수 , (, )이 들어온다.
25 12
2
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int twoCnt = 0; //2의 개수
int fiveCnt = 0; //5의 개수
twoCnt = getCnt(n, 2) - getCnt(m, 2) - getCnt(n - m, 2);
fiveCnt = getCnt(n, 5) - getCnt(m, 5) - getCnt(n - m, 5);
//2의 5의 개수 중 작은 것 출력
System.out.println(Math.min(twoCnt, fiveCnt));
}
//num!의 countNum의 개수를 구하는 메소드
static int getCnt(int num, int countNum) {
int cnt = 0;
while (num >= countNum) {
cnt += num / countNum;
num /= countNum;
}
return cnt;
}
}
처음엔 조합 공식이 팩토리얼로 이루어 지므로 팩토리얼 메소드를 정의하고,
조합 결과를 직접구해서 단순히 끝 0의 개수를 카운트하려 했는데
입력값으로 주어지는 n과 m의 최대값이 20억이라..
거기다 계속 재귀 함수를 호출해서 직접 조합의 결과값을 구하려는건
무조건 메모리 초과가 날 수 밖에 없었다.
그래서 도저히 아이디어가 생각이 나질 않아서 구글링을 했는데
팩토리얼의 연산을 하지 않아도 특정 소인수를 개수를 세는 방법이 있었다.
확실히 수학에 관련된 문제는 수학을 잘하면 유리한 거 같다..