728x90
반응형
출처 : 링크
그냥 조합으로 풀면 시간 안에 해결이 불가능하다.
끝자리 0의 개수만 구하면 되므로 다 계산할 필요가 없다.
일단 조합의 식은 아래와 같다.
nCm = n! / (n-m)! * m!
결국 이 값에서 2의 배수와 5의 배수의 갯수를 찾으면 된다. 2의 배수 1개와 5의 배수 1개가 만나면 10이 되어 끝자리 0 하나가 생기기 때문
주의) 25부터는 5가 두개, 4부터는 2가 2개이므로 반복문을 잘 돌려야 함
5와 2 모두 n!에서 개수를 구해주고, 나눠지는 (n-m)!이랑 m!에서 나오는 개수를 빼주면 된다.
그리고 5와 2 중에 개수 최소값을 출력하면 끝이다
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main_2004_조합0의개수 { static long n, k; static long five, two; // 5와 2의 수 저장할 변수 public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine(), " "); n = Long.parseLong(st.nextToken()); k = Long.parseLong(st.nextToken()); five = 0; two = 0; five = fiveCount(n); two = twoCount(n); five -= fiveCount(n - k); five -= fiveCount(k); two -= twoCount(n - k); two -= twoCount(k); System.out.println(five <= two ? five : two); // 최소값으로 출력 } public static long fiveCount(long n) { // 5의 개수 세기 long cnt = 0; for (long i = 5; i <= n; i *= 5) { cnt += n / i; } return cnt; } public static long twoCount(long n) { // 2의 개수 세기 long cnt = 0; for (long i = 2; i <= n; i *= 2) { cnt += n / i; } return cnt; } } | cs |
728x90
반응형
'Algorithm > 백준(BOJ)' 카테고리의 다른 글
[백준 2839] 설탕 배달 (Java) (0) | 2019.03.24 |
---|---|
[백준 2470] 두 용액 (Java) (0) | 2019.03.24 |
[백준 2503] 숫자 야구 (Java) (0) | 2019.03.23 |
[백준 3055] 탈출 (java, bfs) (0) | 2019.03.07 |
[백준 2583] 영역 구하기 (java, BFS) (1) | 2019.03.03 |