1.9 KiB
1.9 KiB
id | title | challengeType | forumTopicId | dashedName |
---|---|---|---|---|
5900f3ba1000cf542c50fecd | Problema 78: Partizioni di monete | 1 | 302191 | problem-78-coin-partitions |
--description--
{p}(n)
rappresenta il numero di modi differenti nei quali n
monete possono essere separate in pile. Ad esempio, cinque monete possono essere separate in pile esattamente in sette modi diversi, quindi {p}(5) = 7
.
Pile di monete |
---|
OOOOO |
OOOO O |
OOO OO |
OOO O O |
OO OO O |
OO O O O |
O O O O O |
Trova il valore minimo di n
per il quale {p}(n)
è divisibile per divisor
.
--hints--
coinPartitions(7)
dovrebbe restituire un numero.
assert(typeof coinPartitions(7) === 'number');
coinPartitions(7)
dovrebbe restituire 5
.
assert.strictEqual(coinPartitions(7), 5);
coinPartitions(10000)
dovrebbe restituire 599
.
assert.strictEqual(coinPartitions(10000), 599);
coinPartitions(100000)
dovrebbe restituire 11224
.
assert.strictEqual(coinPartitions(100000), 11224);
coinPartitions(1000000)
dovrebbe restituire 55374
.
assert.strictEqual(coinPartitions(1000000), 55374);
--seed--
--seed-contents--
function coinPartitions(divisor) {
return true;
}
coinPartitions(7);
--solutions--
function coinPartitions(divisor) {
const partitions = [1];
let n = 0;
while (partitions[n] !== 0) {
n++;
partitions.push(0);
let i = 0;
let pentagonal = 1;
while (pentagonal <= n) {
const sign = i % 4 > 1 ? -1 : 1;
partitions[n] += sign * partitions[n - pentagonal];
partitions[n] = partitions[n] % divisor;
i++;
let k = Math.floor(i / 2) + 1;
if (i % 2 !== 0) {
k *= -1;
}
pentagonal = Math.floor((k * (3 * k - 1)) / 2);
}
}
return n;
}