Як ми дізналися з «Святих чисел» , існує 5 святих цифр ( 0, 4, 6, 8, 9
), а додатні цілі числа, що складаються виключно з цих цифр, є святими. Крім того, святість ряду є сумою отворів в кількості ( +2
для кожного 0
або 8
, і в +1
іншому випадку).
Тепер є додаткова властивість, яку слід врахувати, щоб справді і точно представити святість числа. Розумієте, важливе значення має не лише кількість дірок у цифрі, а й те, де в кількості це відбувається.
Розглянемо число 88
. За нашими старими правилами, це було б святістю 4
. Але це навряд чи справедливо! 8
Зліва робить більше роботи , ніж інший 8
- в 10 разів більше роботи! Його слід винагороджувати за свою працю. Ми будемо винагороджувати її додатковими пунктами святості, рівними загальній святості всіх цифр праворуч (включаючи додаткові бали святості, надані цим правилом, цифрам праворуч), мінус 1.
Ось кілька прикладів, які слід врахувати:
Number: 8080
Digital holiness: (2 + 7 - 1) + (2 + 3 - 1) + (2 + 1 - 1) + (2 + 0 - 1)
Total holiness: 15
Number: 68904
Digital holiness: (1 + 5 - 1) + (2 + 2 - 1) + (1 + 1 - 1) + (2 + 0 - 1) + (1 + 0 - 1)
Total holiness: 10
Усі цифри належним чином нагороджуються за свою працю додатковою святістю, і все добре. Ми будемо називати цю властивість "посиленою холодністю".
На чудовому мові Python алгоритм обчислення посиленої галасності може виглядати приблизно так:
# assumes n is a holy number
def enhanced_holarity(n):
if n < 10:
return 1 if n in [0, 8] else 0
else:
digits = list(map(int,str(n)[::-1]))
res = []
for i,x in enumerate(digits):
res.append(enhanced_holarity(x))
if i > 0:
res[i] += sum(res[:i])
return sum(res)
Змагання
Враховуючи ціле число n > 0
, виведіть перші n
Святі числа, відсортовані за зростанням посиленої галасності, використовуючи числове значення як розрив. Ви можете припустити, що вхід і вихід не будуть перевищувати максимальне представлене ціле число у вашій мові, або 2^64 - 1
залежно від того, що менше.
Для довідки, ось декілька тестових випадків (введення, а потім вихід):
25
4, 6, 9, 44, 46, 49, 64, 66, 69, 94, 96, 99, 0, 8, 84, 86, 89, 40, 48, 60, 68, 90, 98, 80, 88
100
4, 6, 9, 44, 46, 49, 64, 66, 69, 94, 96, 99, 444, 446, 449, 464, 466, 469, 494, 496, 499, 644, 646, 649, 664, 666, 669, 694, 696, 699, 0, 8, 84, 86, 89, 844, 846, 849, 864, 866, 869, 894, 896, 899, 40, 48, 60, 68, 90, 98, 404, 406, 409, 484, 486, 489, 604, 606, 609, 684, 686, 689, 80, 88, 804, 806, 809, 884, 886, 889, 440, 448, 460, 468, 490, 498, 640, 648, 660, 668, 690, 698, 840, 848, 860, 868, 890, 898, 400, 408, 480, 488, 600, 608, 680, 688, 800, 808, 880, 888
200
4, 6, 9, 44, 46, 49, 64, 66, 69, 94, 96, 99, 444, 446, 449, 464, 466, 469, 494, 496, 499, 644, 646, 649, 664, 666, 669, 694, 696, 699, 944, 946, 949, 964, 966, 969, 994, 996, 999, 4444, 4446, 4449, 4464, 4466, 4469, 4494, 4496, 4499, 4644, 4646, 4649, 4664, 4666, 4669, 4694, 4696, 4699, 0, 8, 84, 86, 89, 844, 846, 849, 864, 866, 869, 894, 896, 899, 40, 48, 60, 68, 90, 98, 404, 406, 409, 484, 486, 489, 604, 606, 609, 684, 686, 689, 904, 906, 909, 984, 986, 989, 4044, 4046, 4049, 4064, 4066, 4069, 4094, 4096, 4099, 80, 88, 804, 806, 809, 884, 886, 889, 440, 448, 460, 468, 490, 498, 640, 648, 660, 668, 690, 698, 940, 948, 960, 968, 990, 998, 4404, 4406, 4409, 4484, 4486, 4489, 4604, 4606, 4609, 4684, 4686, 4689, 840, 848, 860, 868, 890, 898, 400, 408, 480, 488, 600, 608, 680, 688, 900, 908, 980, 988, 4004, 4006, 4009, 4084, 4086, 4089, 800, 808, 880, 888, 4440, 4448, 4460, 4468, 4490, 4498, 4640, 4648, 4660, 4668, 4690, 4698, 4040, 4048, 4060, 4068, 4090, 4098, 4400, 4408, 4480, 4488, 4600, 4608, 4680, 4688, 4000, 4008, 4080, 4088
2^64 - 1
? Якщо це так, напевно, варто розібратися, який вхід спочатку генерує такі числа, щоб люди могли перевірити свої відповіді.