Ходжа Насреддин находится в левой
верхней клетке таблицы размером n × n, а его осел – в правой нижней. Ходжа может
двигаться только вправо или вниз, а осел – только влево или вверх.
Сколькими способами они могут
встретиться в одной клетке? Два способа считаются различными, если в них хотя
бы один из маршрутов Ходжи или осла отличается от другого.
Вход. Одно
число n (1 ≤ n ≤ 50).
Выход. Выведите
одно число – количество способов, которыми Ходжа и осел могут встретиться. Поскольку
это число может быть очень большим, выведите его по модулю 9929.
Пример
входа |
Пример
выхода |
3 |
30 |
динамическое
программирование
Пусть a[i][j]
содержит количество путей, которыми Ходжа Насреддин может добраться из клетки (1, 1) в клетку (i, j).
Пусть b[i][j] содержит
количество путей, которыми осел может добраться из клетки (n, n)
в клетку (i, j).
Количество способов, которыми
Ходжа и осел могут встретиться в клетке (i,
j), равно a[i][j]
* b[i][j].
Для получения ответа остаётся
вычислить сумму произведений по модулю 9929:
= (6 + 3 + 1) + (3
+ 4 + 3) + (1 + 3 + 6) = 30
Объявим
рабочие массивы.
#define MAX 55
#define MOD 9929
int a[MAX][MAX], b[MAX][MAX];
Читаем
входное значение n.
scanf("%d", &n);
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
Вычисляем
значения ячеек массивов a и 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;
В
переменной res находим количество
способов, которыми Ходжа и осел могут встретиться.
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);