一堆三元组是没法数的,肯定得直接数生成的序列
考虑每个三元组长度为 (废话) ,最终排列中不可能有某个数字大于后面的连续的三个数字
因为考虑下一个拿出来的数字如果比他小肯定是因为这是他所在的三元组的下一个被拿出来了,所以不可能多于三个
那我们对于这个数列取前缀
但是不够充分
思考原来的结构,长度为
长度为
所以长度为
所以这就是充要条件
设
那设
进行转移的话就是
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 2005;
const int Offset = N * 3;
ll mod;
int n;
ll dp[N * 3][N * 6];
int main() {
cin >> n >> mod;
dp[0][0 + Offset] = 1;
for (int i = 0; i < n * 3; i++) {
for (int j = -i; j <= i; j++) {
dp[i + 1][j + 1 + Offset] += dp[i][j + Offset];
dp[i + 1][j + 1 + Offset] %= mod;
dp[i + 2][j - 1 + Offset] += dp[i][j + Offset] * (i + 1) % mod;
dp[i + 2][j + 1 + Offset] %= mod;
dp[i + 3][j + Offset] +=
1ll * dp[i][j + Offset] * (i + 1) % mod * (i + 2) % mod;
dp[i + 3][j + 1 + Offset] %= mod;
}
}
ll ans = 0;
for (int i = 0; i <= n * 3; i++) {
ans += dp[n * 3][i + Offset];
ans %= mod;
}
cout << ans;
return 0;
}
// Asusetic eru quionours