Классная задача. Разложим её по шагам и найдём правильное решение.
Суть задачи
- Квадратное поле размером n × n.
- Диагональ (от верхнего левого к нижнему правому углу) отдают под помидоры.
- Остальные клетки делят пополам: одна половина под перцы, другая под помидоры, но диагональ уже занята помидорами.
- Хочется, чтобы суммарное число помидоров и перцев было квадратом числа n (то есть равно n^2).
Разбор и формулы
- Всего клеток: n^2.
- Число клеток на диагонали: n.
- Число клеток ниже диагонали и выше диагонали по ровну: каждая часть содержит n(n-1)/2 клеток.
- Предположим, что под помидоры помимо диагонали взята нижняя половина (или верхняя, это не важно — суть одна и та же). Тогда:
- помидоры = диагональ + нижняя половина = n + n(n-1)/2 = n(n+1)/2
- перцы = верхняя половина = n(n-1)/2
- Сумма помидоров и перцев: n(n+1)/2 + n(n-1)/2 = n^2 — это квадрат числа n.
Где часто ломается код
- Если считать обе части неправильно или дублируть/пропускать диагональ, сумма может оказаться не равной n^2.
- Чтобы гарантировать корректность, проще посчитать одну часть и взять другую как разницу от общего числа клеток:
- total = n^2
- tomatoes = n(n+1)/2
- peppers = total - tomatoes
- Это гарантирует, что сумма равна total, то есть квадрату n.
Пример
- n = 5:
- total = 25
- tomatoes = 5 * 6 / 2 = 15
- peppers = 25 - 15 = 10
- сумма = 15 + 10 = 25 (квадрат числа 5)
Пошаговый алгоритм для отладки
- Возьми входное n и посмотри, что получается для small тестов:
- n = 1 → total = 1, tomatoes = 1, peppers = 0
- n = 2 → total = 4, tomatoes = 3, peppers = 1
- n = 3 → total = 9, tomatoes = 6, peppers = 3 Эти значения должны удовлетворять tomatoes + peppers = total.
- Убедись, что формула для помидоров действительно n(n+1)/2 (целочисленное деление).
- Убедись, что peppers вычисляются как total - tomatoes.
- Проверь вывод для n=5: 15 10 25.
Примеры кода (посредственный язык – Python; аналогичные идеи годятся и для C++/Java)
Python (работает прямо как решение задачи): def solve(n): total = n * n tomatoes = n * (n + 1) // 2 # помидоры: диагональ + нижняя половина peppers = total - tomatoes # перцы — оставшаяся часть return tomatoes, peppers, total
пример проверки
for n in range(1, 6): print(n, solve(n))
Ожидаемый вывод: 1 -> (1, 0, 1) 2 -> (3, 1, 4) 3 -> (6, 3, 9) 4 -> (10, 6, 16) 5 -> (15, 10, 25)
Если хочешь увидеть аналог на C++: #include <bits/stdc++.h> using namespace std;
int main() { long long n; if (!(cin >> n)) return 0; long long total = n * n; long long tomatoes = n * (n + 1) / 2; // диагональ + нижняя половина long long peppers = total - tomatoes; cout << tomatoes << " " << peppers << " " << total << "\n"; return 0; }
Ключевые выводы
- Правильная формула: tomatoes = n(n+1)/2, peppers = n^2 - tomatoes, сумма всегда равна n^2.
- Чтобы избежать ошибок, можно напрямую вычислить peppers как total - tomatoes.
- Для проверки достаточно протестировать на небольших n и убедиться, что tomatoes + peppers = n^2.
Если хочешь, могу адаптировать решение под конкретный язык или привести пошаговый отладочный чек-лист под твой код.