2018-09-30 22:01:58 +00:00
---
id: 5900f3c51000cf542c50fed8
title: 'Problem 87: Prime power triples'
2020-11-27 18:02:05 +00:00
challengeType: 5
2019-08-05 16:17:33 +00:00
forumTopicId: 302201
2021-01-13 02:31:00 +00:00
dashedName: problem-87-prime-power-triples
2018-09-30 22:01:58 +00:00
---
2020-11-27 18:02:05 +00:00
# --description--
2020-02-28 12:39:47 +00:00
2021-05-27 07:44:40 +00:00
The smallest number expressible as the sum of a prime square, prime cube, and prime fourth power is `28` . In fact, there are exactly four numbers below fifty that can be expressed in such a way:
2020-02-28 12:39:47 +00:00
< div style = 'margin-left: 4em;' >
28 = 2< sup > 2< / sup > + 2< sup > 3< / sup > + 2< sup > 4< / sup > < br >
33 = 3< sup > 2< / sup > + 2< sup > 3< / sup > + 2< sup > 4< / sup > < br >
49 = 5< sup > 2< / sup > + 2< sup > 3< / sup > + 2< sup > 4< / sup > < br >
47 = 2< sup > 2< / sup > + 3< sup > 3< / sup > + 2< sup > 4< / sup >
2021-05-27 07:44:40 +00:00
< / div > < br >
2020-02-28 12:39:47 +00:00
2021-05-27 07:44:40 +00:00
How many numbers below `n` can be expressed as the sum of a prime square, prime cube, and prime fourth power?
2020-02-28 12:39:47 +00:00
2020-11-27 18:02:05 +00:00
# --hints--
2018-09-30 22:01:58 +00:00
2021-05-27 07:44:40 +00:00
`primePowerTriples(50)` should return a number.
2018-09-30 22:01:58 +00:00
2020-11-27 18:02:05 +00:00
```js
2021-05-27 07:44:40 +00:00
assert(typeof primePowerTriples(50) === 'number');
2020-11-27 18:02:05 +00:00
```
2018-09-30 22:01:58 +00:00
2021-05-27 07:44:40 +00:00
`primePowerTriples(50)` should return `4` .
2018-09-30 22:01:58 +00:00
2020-11-27 18:02:05 +00:00
```js
2021-05-27 07:44:40 +00:00
assert.strictEqual(primePowerTriples(50), 4);
```
`primePowerTriples(10035)` should return `684` .
```js
assert.strictEqual(primePowerTriples(10035), 684);
```
`primePowerTriples(500000)` should return `18899` .
```js
assert.strictEqual(primePowerTriples(500000), 18899);
```
`primePowerTriples(5000000)` should return `138932` .
```js
assert.strictEqual(primePowerTriples(5000000), 138932);
```
`primePowerTriples(50000000)` should return `1097343` .
```js
assert.strictEqual(primePowerTriples(50000000), 1097343);
2018-09-30 22:01:58 +00:00
```
2020-11-27 18:02:05 +00:00
# --seed--
2018-09-30 22:01:58 +00:00
2020-11-27 18:02:05 +00:00
## --seed-contents--
2018-09-30 22:01:58 +00:00
```js
2021-05-27 07:44:40 +00:00
function primePowerTriples(n) {
2020-09-15 16:57:40 +00:00
2018-09-30 22:01:58 +00:00
return true;
}
2021-05-27 07:44:40 +00:00
primePowerTriples(50);
2018-09-30 22:01:58 +00:00
```
2020-11-27 18:02:05 +00:00
# --solutions--
2018-09-30 22:01:58 +00:00
```js
2021-05-27 07:44:40 +00:00
function primePowerTriples(n) {
function getSievePrimes(max) {
const primes = [];
const primesMap = new Array(max).fill(true);
primesMap[0] = false;
primesMap[1] = false;
for (let i = 2; i < = max; i += 2) {
if (primesMap[i]) {
primes.push(i);
for (let j = i * i; j < = max; j = j + i) {
primesMap[j] = false;
}
}
if (i === 2) {
i = 1;
}
}
return primes;
}
function getPowersSummed(numbers, powers, limit, curSum) {
if (curSum >= limit) {
return [];
} else if (powers.length === 0) {
return [curSum];
}
const powersSummed = [];
const curPower = powers[0];
const powersLeft = powers.slice(1);
for (let i = 0; i < numbers.length ; i + + ) {
const curNumber = numbers[i];
const nextSum = curSum + curNumber ** curPower;
if (nextSum >= limit) {
return powersSummed;
}
const result = getPowersSummed(
numbers,
powersLeft,
limit,
curSum + curNumber ** curPower
);
powersSummed.push(...result);
}
return powersSummed;
}
const maximumBaseNumber = Math.floor(Math.sqrt(n - 2 ** 3 - 2 ** 4)) + 1;
const primes = getSievePrimes(maximumBaseNumber);
const uniqueSums = new Set(getPowersSummed(primes, [2, 3, 4], n, 0));
return uniqueSums.size;
}
2018-09-30 22:01:58 +00:00
```