Карткові будинки#5716

Карткові будинки (Розбір)

Нехай — кількість карт, необхідних для побудови карткового будинку висоти . Наприклад, f(1) = 2, f(2) = 7, f(3) = 15.

Щоб побудувати будинок висоти , в основі необхідно встановити будинків висоти , на що знадобиться карт, а також h - 1 перекриттів. На цю основу потім встановлюється будинок висоти h - 1, для будівництва якого потрібно f(h - 1) карт.

Відповідно,

f(h) = 2h + h - 1 + f(h - 1)

або

f(h) = 3h - 1 + f(h - 1)

Виведемо явну формулу. Послідовно розкриваючи рекурсію, отримаємо:

f(h) = 3h - 1 + f(h - 1) = \\ = 3h - 1 + 3(h - 1) - 1 + f(h - 2) = \\ . . . \\ = 3h - 1 + 3(h - 1) - 1 + 3(h - 2) - 1 + ... + 3 \cdot 1 - 1 = \\ = 3 (h + (h - 1) + (h - 2) + ... + 1) - h = \\ = 3 \cdot \frac{h + 1}{2} h - h = \frac{3h^2+3h}{2} - \frac{2h}{2} = \frac{3h^2+h}{2}

Приклад

Для будинку висоти достатньо карти.

Для будинку висоти необхідно карт.

Будинок висоти можна побудувати із карт.

Реалізація алгоритму

Читаємо висоту будинку .

scanf("%lld", &n);

Визначаємо та виводимо кількість карт у будинку.

res = n * (3 * n + 1) / 2;
printf("%lld\n", res);