Ходжа Насреддін#5101

Ходжа Насреддін (Розбір)

Ходжа й ослик зустрічаються в деякій клітинці таблиці. Спосіб зустрічі визначається трьома складовими: клітинкою зустрічі, маршрутом Ходжі з клітинки до цієї клітинки та маршрутом ослика з клітинки до неї. Тому для кожної клітинки порахуємо кількість маршрутів Ходжі та ослика, що ведуть до неї.

Нехай — кількість шляхів, якими Ходжа може потрапити з клітинки до клітинки . Ходжа рухається лише праворуч або вниз, тому до клітинки він потрапляє або з клітинки (i - 1, j), що розташована над нею, або з клітинки (i, j - 1), що розташована ліворуч від неї:

a[i][j] = a[i - 1][j] + a[i][j - 1], \\ a[1][1] = 1

Клітинки поза межами таблиці недосяжні; кількість шляхів до них вважається рівною нулю.

Аналогічно, нехай — кількість шляхів, якими ослик може потрапити з клітинки до клітинки . Ослик рухається лише ліворуч або вгору, тому до клітинки він потрапляє або з клітинки (i + 1, j), що розташована під нею, або з клітинки (i, j + 1), що розташована праворуч від неї:

b[i][j] = b[i + 1][j] + b[i][j + 1], \\ b[n][n] = 1

Маршрути Ходжі та ослика обираються незалежно один від одного. Тому за правилом добутку кількість способів зустрітися в клітинці дорівнює a[i][j] \cdot b[i][j]. Зустрічі в різних клітинках є різними способами, тому за правилом суми відповідь дорівнює сумі таких добутків за всіма клітинками таблиці.

Залишається обчислити цю суму за модулем :

\sum_{i=1}^{n} \sum_{j=1}^{n} a_{ij} \cdot b_{ij} \bmod 9929

Приклад

Для n = 3 побудуємо масиви та . Масив заповнюється зверху вниз і зліва направо. Масив заповнюється у зворотному порядку, починаючи з b[3][3] = 1. Третя таблиця містить добутки a[i][j] \cdot b[i][j].

Наприклад, Ходжа може дістатися центральної клітинки двома способами (a[2][2] = 2), так само як і ослик (b[2][2] = 2). Отже, вони можуть зустрітися в цій клітинці 2 \cdot 2 = 4 способами.

Ходжа спочатку знаходиться у верхній лівій клітинці (a[1][1] = 1), а ослик може дістатися до неї шістьма способами (b[1][1] = 6), що дає способів.

Підсумувавши добутки за всіма клітинками, отримуємо відповідь:

\sum_{i=1}^{3} \sum_{j=1}^{3} a_{ij} \cdot b_{ij} = (6 + 3 + 1) + (3 + 4 + 3) + (1 + 3 + 6) = 30

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

Оголосимо робочі масиви:

Усі значення зберігаються за модулем MOD = 9929. Розмір масивів — MAX = 55.

#define MAX 55
#define MOD 9929
int a[MAX][MAX], b[MAX][MAX];

Зчитаємо розмір таблиці . Заповнимо масиви та нулями.

scanf("%d", &n);
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));

Обчислимо значення масиву .

a[1][1] = 1;
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
  a[i][j] = (a[i][j] + a[i - 1][j] + a[i][j - 1]) % MOD;

Обчислимо значення масиву .

b[n][n] = 1;
for (i = n; i >= 1; i--)
for (j = n; j >= 1; j--)
  b[i][j] = (b[i][j] + b[i + 1][j] + b[i][j + 1]) % MOD;

У змінній обчислимо суму добутків a[i][j] \cdot b[i][j] за всіма клітинками таблиці — кількість способів, якими Ходжа й ослик можуть зустрітися.

res = 0;
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
  res = (res + a[i][j] * b[i][j]) % MOD;

Виведемо відповідь.

printf("%d\n", res);