Загрузка данных
### Блок 1: Хитрые числа и математика (Разминка для мозгов)
1. **Совершенные числа.** Напишите программу, которая находит все «совершенные числа» в диапазоне от 1 до $N$. Совершенное число — это число, равное сумме всех своих собственных делителей (например, 6 = 1 + 2 + 3).
2. **Простая факторизация.** Дано число $N$. Выведите его разложение на простые множители в виде степеней. Например, для 72 вывод должен быть: `2^3 * 3^2`.
3. **Гипотеза Коллатца (Сиракузская последовательность) на максималках.** Найдите число в диапазоне от 1 до 100 000, которое порождает самую длинную последовательность Коллатца, прежде чем дойдет до единицы. Выведите само число и длину его цепи.
4. **Числа Армстронга $K$-го порядка.** Пользователь вводит длину числа $K$ (от 3 до 7). Найдите все числа длины $K$, которые равны сумме своих цифр, возведенных в степень $K$ (например, $153 = 1^3 + 5^3 + 3^3$).
5. **Проверка гипотезы Гольдбаха.** Дано четное число $N > 2$. Выведите все возможные пары простых чисел, сумма которых равна $N$. (Например, для 28: 5+23, 11+17). Оптимизируйте циклы, чтобы не проверять лишнее.
6. **Числа Фибоначчи с условием.** Выведите сумму всех *четных* чисел Фибоначчи, которые не превышают заданного значения $N$ (например, 4 000 000).
### Блок 2: Вложенные циклы и двумерное воображение (Вынос мозга принтами)
7. **Спиральная матрица.** Пользователь вводит $N$. Выведите на экран квадратную матрицу $N \times N$, заполненную числами от 1 до $N^2$ по спирали, начиная с верхнего левого угла по часовой стрелке.
8. **Правильный треугольник Паскаля.** Выведите первые $N$ строк треугольника Паскаля, но сделайте так, чтобы вывод был отформатирован в виде симметричной пирамиды (потребуются циклы для правильного подсчета пробелов).
9. **Ромб из букв.** На вход подается латинская буква (например, 'E'). Выведите ромб, где внешний контур — это 'A', следующий слой 'B' и так далее до введенной буквы в центре.
10. **Масштабируемая шахматная доска.** Вводятся два числа: $N$ (размер доски в клетках, например 8х8) и $K$ (размер самой клетки в символах). Отрисуйте доску, где черные клетки состоят из блока символов `#` размера $K \times K$, а белые — из символов `.`.
11. **Диагональный обход матрицы.** Дана матрица $N \times M$ (можно просто генерировать координаты). Выведите её элементы зигзагом (по диагоналям: сначала (0,0), потом (0,1), (1,0), потом (2,0), (1,1), (0,2) и т.д.).
12. **Песочные часы.** Пользователь вводит нечетное число $N$. Выведите фигуру песочных часов из цифр, где в верхней и нижней строке цифры от 1 до $N$, а по мере сужения к центру крайние цифры пропадают (заменяются пробелами).
### Блок 3: Строки и последовательности (Индексы и состояния)
13. **RLE (Run-Length Encoding).** Дана строка типа `AAAABBBCCDAA`. Используя циклы, сожмите её до `4A3B2C1D2A`. И наоборот: напишите цикл для распаковки обратно.
14. **Look-and-Say (Посмотри и скажи).** Сгенерируйте $N$-й элемент последовательности, где каждый следующий элемент описывает предыдущий: 1, 11, 21, 1211, 111221, 312211 и т.д.
15. **Наивный поиск подстроки с подвохом.** Дана строка и подстрока. Найдите ВСЕ индексы вхождения подстроки, но перекрывающиеся вхождения тоже должны считаться! (Например, в "AAAA" подстрока "AA" встречается по индексам 0, 1 и 2). Не использовать встроенные методы поиска.
16. **Зигзаг-строка.** Дана строка и число строк $K$. Выведите строку так, как если бы она была написана зигзагом по $K$ строкам, а затем прочитана построчно. (Классика LeetCode).
17. **Самый длинный палиндром.** Используя вложенные циклы (без динамического программирования), найдите самую длинную подстроку в введенной строке, которая читается одинаково в обе стороны.
18. **Анаграммы в окне.** Даны длинная строка $T$ и короткая $S$. Найдите все стартовые индексы в $T$, начиная с которых идет любая перестановка (анаграмма) строки $S$. (Намек на концепцию скользящего окна в цикле).
### Блок 4: Алгоритмические задачи (Прокачка сложности O(N))
19. **Максимальная подпоследовательность (Алгоритм Кадане руками).** Дан массив положительных и отрицательных чисел. Используя ровно *один* цикл, найдите непрерывную подпоследовательность с максимальной суммой.
20. **Сортировка "Голландский национальный флаг".** Дан массив, состоящий только из 0, 1 и 2. Отсортируйте его за *один проход* цикла (используя 3 указателя), не используя дополнительную память.
21. **Скользящее среднее.** Дана последовательность из $N$ чисел и размер окна $W$. Выведите массив скользящих средних. Сделайте это эффективно: при сдвиге окна не считайте сумму $W$ элементов заново каждый раз (избавьтесь от вложенного цикла).
22. **Элемент большинства.** В массиве длины $N$ один элемент встречается строго больше $N/2$ раз. Найдите его за один проход цикла, используя только две дополнительные переменные $O(1)$ памяти (Алгоритм большинства Бойера-Мура).
23. **Слияние отсортированных массивов.** Даны два уже отсортированных массива разной длины. Используя цикл(ы), создайте третий массив, в котором элементы обоих будут слиты в отсортированном порядке без использования встроенных функций сортировки.
24. **Удаление дубликатов на месте.** Дан отсортированный массив. Используя один цикл и два указателя, измените массив так, чтобы все уникальные элементы оказались в его начале. Выведите количество уникальных элементов.
### Блок 5: Симуляции и Хардкор (Тут они начнут страдать)
25. **Улитка с усталостью.** Улитка ползет по стене высотой $H$ метров. Днем ползет на $U$ метров вверх, ночью сползает на $D$ метров вниз. Но улитка устает: каждый новый день она проползает вверх на $F\%$ меньше от *изначальной* дневной дистанции $U$ (при этом вниз сползает всегда на $D$). На какой день она выберется из колодца, или она в итоге соскользнет на дно?
26. **Игра "Жизнь" Конвея.** Реализуйте один такт (шаг) игры "Жизнь" для двумерного поля $N \times M$. (Проверка всех соседей клетки с учетом краев поля — отличная тренировка вложенных циклов и условных операторов).
27. **Захват дождевой воды (Trapping Rain Water).** Дан массив высот столбиков (ширина каждого 1). Вычислите, сколько единиц воды может скопиться между столбиками после дождя. Смогут ли студенты решить это без вложенных $O(N^2)$ циклов, а за $O(N)$?
28. **Прыжки по массиву.** Дан массив неотрицательных чисел. Каждое число означает максимальную длину прыжка вперед с этого индекса. Вы находитесь на индексе 0. Определите минимальное количество прыжков, необходимое, чтобы добраться до конца массива (или скажите, если это невозможно).
29. **Печать чека.** Напишите программу, которая принимает на вход список покупок (Название, Цена, Количество) до тех пор, пока пользователь не введет "СТОП". Затем программа должна вывести красиво отформатированный чек с рамкой из символов `*`, выравниванием названий по левому краю, цен — по правому, и итоговой суммой в конце.
30. **Расписание турнира (Round-robin).** Дано четное число команд $N$. Сгенерируйте расписание матчей "каждый с каждым" по турам. В каждом туре все команды должны сыграть ровно один матч. (Алгоритм кругового турнира требует очень элегантной работы с индексами в цикле).