132 lines
3.0 KiB
Markdown
132 lines
3.0 KiB
Markdown
---
|
|
id: 5900f3c51000cf542c50fed8
|
|
title: 'Problema 87: Trios de potência de primos'
|
|
challengeType: 5
|
|
forumTopicId: 302201
|
|
dashedName: problem-87-prime-power-triples
|
|
---
|
|
|
|
# --description--
|
|
|
|
O menor número que pode ser expresso como a soma de um quadrado de primo, cubo de primos e primos na quarta potência é `28`. Na verdade, há exatamente quatro números abaixo de cinquenta que podem ser expressos dessa forma:
|
|
|
|
<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>
|
|
</div><br>
|
|
|
|
Quantos números abaixo de `n` podem ser expressos como a soma do quadrado de um número primo, do cubo de um número primo e de um número primo na quarta potência?
|
|
|
|
# --hints--
|
|
|
|
`primePowerTriples(50)` deve retornar um número.
|
|
|
|
```js
|
|
assert(typeof primePowerTriples(50) === 'number');
|
|
```
|
|
|
|
`primePowerTriples(50)` deve retornar `4`.
|
|
|
|
```js
|
|
assert.strictEqual(primePowerTriples(50), 4);
|
|
```
|
|
|
|
`primePowerTriples(10035)` deve retornar `684`.
|
|
|
|
```js
|
|
assert.strictEqual(primePowerTriples(10035), 684);
|
|
```
|
|
|
|
`primePowerTriples(500000)` deve retornar `18899`.
|
|
|
|
```js
|
|
assert.strictEqual(primePowerTriples(500000), 18899);
|
|
```
|
|
|
|
`primePowerTriples(5000000)` deve retornar `138932`.
|
|
|
|
```js
|
|
assert.strictEqual(primePowerTriples(5000000), 138932);
|
|
```
|
|
|
|
`primePowerTriples(50000000)` deve retornar `1097343`.
|
|
|
|
```js
|
|
assert.strictEqual(primePowerTriples(50000000), 1097343);
|
|
```
|
|
|
|
# --seed--
|
|
|
|
## --seed-contents--
|
|
|
|
```js
|
|
function primePowerTriples(n) {
|
|
|
|
return true;
|
|
}
|
|
|
|
primePowerTriples(50);
|
|
```
|
|
|
|
# --solutions--
|
|
|
|
```js
|
|
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;
|
|
}
|
|
```
|