Files
gikf 911d18bae5 fix(curriculum): rework Project Euler 78 (#42104)
* fix: rework challenge to use argument in function

* fix: add solution

* fix: improve look and spacing
2021-05-14 11:49:23 +05:30

104 lines
1.9 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
id: 5900f3ba1000cf542c50fecd
title: 'Problem 78: Coin partitions'
challengeType: 5
forumTopicId: 302191
dashedName: problem-78-coin-partitions
---
# --description--
Let ${p}(n)$ represent the number of different ways in which `n` coins can be separated into piles. For example, five coins can be separated into piles in exactly seven different ways, so ${p}(5) = 7$.
<div style='text-align: center;'>
| Coin piles |
| ----------------- |
| OOOOO |
| OOOO   O |
| OOO   OO |
| OOO   O   O |
| OO   OO   O |
| OO   O   O   O |
| O   O   O   O   O |
</div><br>
Find the least value of `n` for which ${p}(n)$ is divisible by `divisor`.
# --hints--
`coinPartitions(7)` should return a number.
```js
assert(typeof coinPartitions(7) === 'number');
```
`coinPartitions(7)` should return `5`.
```js
assert.strictEqual(coinPartitions(7), 5);
```
`coinPartitions(10000)` should return `599`.
```js
assert.strictEqual(coinPartitions(10000), 599);
```
`coinPartitions(100000)` should return `11224`.
```js
assert.strictEqual(coinPartitions(100000), 11224);
```
`coinPartitions(1000000)` should return `55374`.
```js
assert.strictEqual(coinPartitions(1000000), 55374);
```
# --seed--
## --seed-contents--
```js
function coinPartitions(divisor) {
return true;
}
coinPartitions(7);
```
# --solutions--
```js
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;
}
```