ABC G n8 求卡常
  • 板块学术版
  • 楼主Register_int-std=c++14
  • 当前回复7
  • 已保存回复7
  • 发布时间2025/1/18 22:04
  • 上次更新2025/1/19 10:02:26
查看原帖
ABC G n8 求卡常
406941
Register_int-std=c++14楼主2025/1/18 22:04

为啥大家的 n8 都能过。/ll

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

int mod;

int n, c[436][436], f[31][31][436], dp[31][61][31][436], ans[436];

int main() {
	scanf("%d%d", &n, &mod);
	for (int i = 0; i <= 435; i++) c[i][0] = 1;
	for (int i = 1; i <= 435; i++) {
		for (int j = 1; j <= i; j++) c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
	}
	for (int i = 1; i <= 30; i++) {
		f[0][i][0] = 1;
		for (int j = 1; j <= 30; j++) {
			for (int k = 1; k <= 435; k++) {
				for (int l = 1; l <= i; l++) {
					for (int r = 0; r < j; r++) {
						if (k >= l + r) f[j][i][k] = (f[j][i][k] + (ll)c[i][l] * c[j - 1][r] % mod * f[j - 1][i][k - l - r]) % mod;
					}
				}
			}
		}
	}
	dp[1][1 + 30][1][0] = 1;
	for (int i = 2; i <= n; i++) {
		for (int j = 1; j < i; j++) {
			for (int k = -i; k <= i; k++) {
				if (j - k < -i + j || j - k > i - j) continue;
				for (int p = 1; p <= i * (i - 1) / 2; p++) {
					int &x = dp[i][k + 30][j][p];
					for (int r = 1; r <= i - j; r++) {
						for (int l = 1; l <= p; l++) {
							x = (x + (ll)c[n - i + j][j] * f[j][r][l] % mod * dp[i - j][j - k + 30][r][p - l]) % mod;
						}
					}
				}
			}
		}
	}
	for (int i = n - 1; i <= n * (n - 1) / 2; i++) {
		for (int j = 1; j <= n; j++) ans[i] = (ans[i] + dp[n][30][j][i]) % mod;
		printf("%d ", ans[i]);
	}
}
2025/1/18 22:04
加载中...