[boj] 2004. 조합 0의 개수 (node.js)
조합은 팩토리얼로 바꿀 수 있고, 팩토리얼에서의 인수의 개수를 확인하는 문제로 바꿔 생각할 수 있다.
뒤에서부터 0의 개수는, 10 = 2 * 5 이므로 2의 인수의 개수와 5의 인수의 개수 중 더 작은 수와 같다.
따라서, 이 문제를 풀기 위해서는 팩토리얼에서 인수의 개수를 구하기 위하는 호율적인 방법을 알면 된다.
팩토리얼에서 인수의 개수는,
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const solution = () => {
const [n, m] = input().split(" ");
let results = [0, 0];
numCounter(n);
numCounter(n - m, -1);
numCounter(m, -1);
console.log(Math.min(...results));
function numCounter(target, mul = 1) {
let cnt = [0n, 0n];
[2n, 5n].forEach((elem, index) => {
for (let i = elem; i <= BigInt(target); i *= elem) {
cnt[index] += BigInt(target) / i;
}
});
cnt.forEach((elem, idx) => (results[idx] += mul * elem.toString()));
}
};
let line = 0;
const input = () => stdin[line++];
let stdin = [];
rl.on("line", function (line) {
stdin.push(line);
}).on("close", function () {
solution();
process.exit();
});