2018-09-30 22:01:58 +00:00
|
|
|
|
---
|
|
|
|
|
id: 5900f4151000cf542c50ff27
|
|
|
|
|
title: 'Problem 168: Number Rotations'
|
2020-11-27 18:02:05 +00:00
|
|
|
|
challengeType: 5
|
2019-08-05 16:17:33 +00:00
|
|
|
|
forumTopicId: 301802
|
2021-01-13 02:31:00 +00:00
|
|
|
|
dashedName: problem-168-number-rotations
|
2018-09-30 22:01:58 +00:00
|
|
|
|
---
|
|
|
|
|
|
2020-11-27 18:02:05 +00:00
|
|
|
|
# --description--
|
|
|
|
|
|
2018-09-30 22:01:58 +00:00
|
|
|
|
Consider the number 142857. We can right-rotate this number by moving the last digit (7) to the front of it, giving us 714285.
|
2020-11-27 18:02:05 +00:00
|
|
|
|
|
2021-07-12 14:19:03 +00:00
|
|
|
|
It can be verified that $714285 = 5 × 142857$.
|
2018-09-30 22:01:58 +00:00
|
|
|
|
|
2020-11-27 18:02:05 +00:00
|
|
|
|
This demonstrates an unusual property of 142857: it is a divisor of its right-rotation.
|
2018-09-30 22:01:58 +00:00
|
|
|
|
|
2022-06-11 06:58:08 +00:00
|
|
|
|
For integer number of digits $a$ and $b$, find the last 5 digits of the sum of all integers $n$, $10^a < n < 10^b$, that have this property.
|
2018-09-30 22:01:58 +00:00
|
|
|
|
|
2020-11-27 18:02:05 +00:00
|
|
|
|
# --hints--
|
2018-09-30 22:01:58 +00:00
|
|
|
|
|
2022-06-11 06:58:08 +00:00
|
|
|
|
`numberRotations(2, 10)` should return `98311`.
|
2018-09-30 22:01:58 +00:00
|
|
|
|
|
2020-11-27 18:02:05 +00:00
|
|
|
|
```js
|
2022-06-11 06:58:08 +00:00
|
|
|
|
assert.strictEqual(numberRotations(2, 10), 98311);
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
`numberRotations(2, 100)` should return `59206`.
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
assert.strictEqual(numberRotations(2, 100), 59206);
|
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
|
2022-06-11 06:58:08 +00:00
|
|
|
|
function numberRotations(a, b) {
|
2020-09-15 16:57:40 +00:00
|
|
|
|
|
2022-06-11 06:58:08 +00:00
|
|
|
|
return 0;
|
2018-09-30 22:01:58 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-07-12 14:19:03 +00:00
|
|
|
|
numberRotations();
|
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
|
2022-06-11 06:58:08 +00:00
|
|
|
|
function numberRotations(minDigits, maxDigits) {
|
|
|
|
|
const DIGITS_TO_KEEP = 100000n;
|
|
|
|
|
const powersOfTen = Array(maxDigits).fill(0);
|
|
|
|
|
powersOfTen[0] = 1n;
|
|
|
|
|
for (let i = 1; i < maxDigits; i++) {
|
|
|
|
|
powersOfTen[i] = powersOfTen[i - 1] * 10n;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// We want numbers of the form xd * m = dx
|
|
|
|
|
// Or more precisely:
|
|
|
|
|
// (x * 10 + d) * m = d*10^(n-1) + x
|
|
|
|
|
// Solving for x:
|
|
|
|
|
// x = d (10^(n-1) - m) / (10 * m - 1)
|
|
|
|
|
let total = 0n;
|
|
|
|
|
for (let numDigits = minDigits; numDigits <= maxDigits; numDigits++) {
|
|
|
|
|
// Check all multiplier - digit pairs to see if a candidate can be built
|
|
|
|
|
// with the correct number of digits
|
|
|
|
|
for (let multiplier = 1n; multiplier < 10n; multiplier++) {
|
|
|
|
|
for (let lastDigit = 1n; lastDigit < 10n; lastDigit++) {
|
|
|
|
|
const numerator = lastDigit * (powersOfTen[numDigits - 1] - multiplier);
|
|
|
|
|
const denominator = (powersOfTen[1] * multiplier - 1n);
|
|
|
|
|
if (numerator % denominator === 0n) {
|
|
|
|
|
const candidate = (numerator / denominator) * 10n + lastDigit;
|
|
|
|
|
if (candidate.toString().length === numDigits) {
|
|
|
|
|
total = (total + candidate) % DIGITS_TO_KEEP;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return parseInt(total);
|
|
|
|
|
}
|
2018-09-30 22:01:58 +00:00
|
|
|
|
```
|