Ходжа й ослик зустрічаються в деякій клітинці таблиці. Спосіб зустрічі визначається трьома складовими: клітинкою зустрічі, маршрутом Ходжі з клітинки до цієї клітинки та маршрутом ослика з клітинки до неї. Тому для кожної клітинки порахуємо кількість маршрутів Ходжі та ослика, що ведуть до неї.
Нехай — кількість шляхів, якими Ходжа може потрапити з клітинки до клітинки . Ходжа рухається лише праворуч або вниз, тому до клітинки він потрапляє або з клітинки (i - 1, j), що розташована над нею, або з клітинки (i, j - 1), що розташована ліворуч від неї:
Клітинки поза межами таблиці недосяжні; кількість шляхів до них вважається рівною нулю.
Аналогічно, нехай — кількість шляхів, якими ослик може потрапити з клітинки до клітинки . Ослик рухається лише ліворуч або вгору, тому до клітинки він потрапляє або з клітинки (i + 1, j), що розташована під нею, або з клітинки (i, j + 1), що розташована праворуч від неї:
Маршрути Ходжі та ослика обираються незалежно один від одного. Тому за правилом добутку кількість способів зустрітися в клітинці дорівнює a[i][j] \cdot b[i][j]. Зустрічі в різних клітинках є різними способами, тому за правилом суми відповідь дорівнює сумі таких добутків за всіма клітинками таблиці.
Залишається обчислити цю суму за модулем :
Приклад
Для 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), що дає способів.
Підсумувавши добутки за всіма клітинками, отримуємо відповідь:
Реалізація алгоритму
Оголосимо робочі масиви:
— кількість шляхів Ходжі з клітинки до клітинки ,
— кількість шляхів ослика з клітинки до клітинки .
Усі значення зберігаються за модулем 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);