Нехай — кількість точок на стороні рівностороннього трикутника. Тоді загальне число точок, необхідних для його повної укладки, дорівнює сумі перших натуральних чисел:
Такі числа називаються трикутними.
Нехай задано ціле число — кількість наявних точок. Необхідно визначити, чи існує таке ціле k > 0, для якого
Помножимо обидві частини рівняння на і приведемо його до стандартного квадратного вигляду:
Це квадратне рівняння відносно . Воно має ціле число розв'язків тоді і тільки тоді, коли його дискримінант є повним квадратом. Дискримінант дорівнює
Отже, число є трикутним тільки тоді, коли значення d = 1 + 8n є повним квадратом. У цьому випадку позитивний корінь рівняння задається формулою
Якщо знайдене значення є позитивним цілим числом, то число трикутне, а — кількість точок на стороні трикутника. В іншому випадку число не є трикутним.
Приклад
Розглянемо n = 55. Підставимо це значення в рівняння:
Обчислимо дискримінант:
Оскільки 441 = 21^2 — повний квадрат, рівняння має цілочисельний розв'язок. Позитивний корінь дорівнює
Отже, число є трикутним і відповідає трикутнику з точками на стороні.
Реалізація алгоритму
Послідовно обробляємо тести. Читаємо вхідне значення .
cs = 1;
while (scanf("%lld", &n), n != -1)
{
printf("Case %d: ", cs++);Вичислюємо дискримінант квадратного рівняння .
d = 1 + 8 * n;Перевіряємо, чи є дискримінант повним квадратом. Для цього обчислюємо sd = ⌊\sqrt{d}⌋ і перевіряємо рівність sd \cdot sd = d. Якщо дискримінант не є повним квадратом, то виводимо рядок "bad".
sd = (long long)sqrt(d);
if (sd * sd != d)
{
printf("bad\n");
continue;
}Обчислюємо і виводимо позитивний корінь рівняння.
k = (-1 + sqrt(d)) / 2;
printf("%lld\n", k);
}