Мы называем числом превышений перестановки $p$ порядка $n$ количество таких $i$, что $1 \le i \le n$ и $p_i > i$, а числом понижений — количество таких $i$, что $1 \le i \le n-1$ и $p_i > p_{i+1}$.
Пусть $h(n, m, k)$ — количество перестановок порядка $n$, у которых число превышений равно $m$, а число понижений равно $k$. Вычислите все значения $h(n, m, k)$ для заданного $n$. Поскольку ответы могут быть очень большими, выведите их по модулю $M$.
Входные данные
В одной строке заданы два целых положительных числа $n$ и $M$, обозначающие порядок перестановки и модуль соответственно.
Выходные данные
Выведите $n$ строк, в каждой из которых содержится $n$ чисел. $j$-е число в $i$-й строке должно быть равно $h(n, i-1, j-1) \bmod M$.
Примеры
Примеры 1
Входные данные
3 998244353
Выходные данные
1 0 0 0 3 1 0 1 0
Примечание
- Перестановки с числом превышений $0$ и числом понижений $0$: $[1, 2, 3]$.
- Перестановки с числом превышений $1$ и числом понижений $1$: $[2, 1, 3]$, $[3, 1, 2]$, $[1, 3, 2]$.
- Перестановки с числом превышений $1$ и числом понижений $2$: $[3, 2, 1]$.
- Перестановки с числом превышений $2$ и числом понижений $1$: $[2, 3, 1]$.
Примеры 2
Входные данные
7 998244353
Выходные данные
1 0 0 0 0 0 0 0 21 70 28 1 0 0 0 35 343 596 209 8 0 0 35 470 1154 673 83 1 0 21 259 582 300 29 0 0 7 49 56 8 0 0 0 1 0 0 0 0 0
Подзадачи
Задача оценивается по группам тестов.
Для $10\%$ данных гарантируется $n \leq 10$.
Для $30\%$ данных гарантируется $n \leq 20$.
Для $60\%$ данных гарантируется $n \leq 35$.
Для $100\%$ данных гарантируется $1 \le n \leq 60$, $M$ — простое число, $10^8 \leq M \leq 10^9$.
Примечание
Вы можете использовать следующий шаблон для ускорения операций взятия по модулю.
#include <bits/stdc++.h>
using namespace std;
using u64 = unsigned long long;
using LL = __uint128_t;
struct FastMod {
u64 b, m;
FastMod(u64 b) : b(b), m(u64((LL(1) << 64) / b)) {}
u64 operator()(u64 a) {
u64 q = (u64) ((LL(m) * a) >> 64);
u64 r = a - q * b;
return r >= b ? r - b : r;
}
} R(2);
int mod;
int main() {
int n; cin >> n >> mod; R = FastMod(mod);
int a = 1e7, b = 2e7;
int c = R(a * (u64)b);
return 0;
}