Files

3.3 KiB
Raw Permalink Blame History

id, title, challengeType, forumTopicId, dashedName
id title challengeType forumTopicId dashedName
5900f3c51000cf542c50fed6 Проблема 88: Сума похідних чисел 5 302203 problem-88-product-sum-numbers

--description--

Натуральне число, N, яке можна записати як суму і добуток даної множини, щонайменше двох натуральних чисел, \\{a_1, a_2, \ldots , a_k\\}, називається чисельною сумою: N = a_1 + a_2 + \cdots + a_k = a_1 × a_2 × \cdots × a_k.

Наприклад, 6 = 1 + 2 + 3 = 1 × 2 × 3.

Для заданої величини, k, необхідно назвати найменше N за допомогою цієї властивості мінімального числа похідних. Таким чином, мінімальними похідними для множин розміру - k = 2, 3, 4, 5, і 6.

k=2: 4 = 2 × 2 = 2 + 2
k=3: 6 = 1 × 2 × 3 = 1 + 2 + 3
k=4: 8 = 1 × 1 × 2 × 4 = 1 + 1 + 2 + 4
k=5: 8 = 1 × 1 × 2 × 2 × 2 = 1 + 1 + 2 + 2 + 2
k=6: 12 = 1 × 1 × 1 × 1 × 2 × 6 = 1 + 1 + 1 + 1 + 2 + 6

Звідси, для 2 ≤ k ≤ 6, мінімальною сумою похідних є 4 + 6 + 8 + 12 = 30; зверніть увагу, що 8 в сумі додається лише раз.

Фактично, як і повним значенням мінімального числа похідних для 2 ≤ k ≤ 12 є \\{4, 6, 8, 12, 15, 16\\}, а сумою є 61.

Яка сума мінімальних похідних чисел для 2 ≤ klimit?

--hints--

productSumNumbers(6) має вивести число.

assert(typeof productSumNumbers(6) === 'number');

productSumNumbers(6) має видати 30.

assert.strictEqual(productSumNumbers(6), 30);

productSumNumbers(12) має видати 61.

assert.strictEqual(productSumNumbers(12), 61);

productSumNumbers(300) має видати 12686.

assert.strictEqual(productSumNumbers(300), 12686);

productSumNumbers(6000) має видати 2125990.

assert.strictEqual(productSumNumbers(6000), 2125990);

productSumNumbers(12000) має видати 7587457.

assert.strictEqual(productSumNumbers(12000), 7587457);

--seed--

--seed-contents--

function productSumNumbers(limit) {

  return true;
}

productSumNumbers(6);

--solutions--

function productSumNumbers(limit) {
  function getProductSums(curProduct, curSum, factorsCount, start) {
    const k = curProduct - curSum + factorsCount;
    if (k <= limit) {
      if (curProduct < minimalProductSums[k]) {
        minimalProductSums[k] = curProduct;
      }
      for (let i = start; i < Math.floor((limit / curProduct) * 2) + 1; i++) {
        getProductSums(curProduct * i, curSum + i, factorsCount + 1, i);
      }
    }
  }

  const minimalProductSums = new Array(limit + 1).fill(2 * limit);
  getProductSums(1, 1, 1, 2);

  const uniqueProductSums = [...new Set(minimalProductSums.slice(2))];

  let sum = 0;
  for (let i = 0; i < uniqueProductSums.length; i++) {
    sum += uniqueProductSums[i];
  }

  return sum;
}