Классная задача. Разложим её по шагам и найдём правильное решение.
Суть задачи
- Квадратное поле размером 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.
Если хочешь, могу адаптировать решение под конкретный язык или привести пошаговый отладочный чек-лист под твой код.