30分球条
查看原帖
30分球条
1217405
nyczg楼主2025/7/1 22:39

哪里写错了

#include <bits/stdc++.h>
using namespace std;

const int mod = 1e9 + 9;
int n, m, cc, c[1005][1005], dp[35][35][205], f[35][35];
void ycl_c() {
	for (int i = 0; i <= 1000; i++) {
		c[i][0] = 1;
		for (int j = 1; j <= i; j++) {
			c[i][j] = c[i - 1][j] + c[i - 1][j - 1];
			c[i][j] %= mod;
			// cout << c[i][j] << ' ';
		}
		// cout << '\n';
	}
}

int main() {
	ycl_c();
	cin >> n >> m >> cc;
	dp[0][0][0] = 1;
	for (int k = 1, a; k <= cc; k ++) {
		cin >> a;
		memset(f, 0, sizeof f);
		for (int i = 1; i <= n; i ++) {
			for (int j = 1; j <= m; j ++) {
				if (i * j < a) continue;
				f[i][j] = c[i * j][a];
				for (int l = 1; l <= i; l ++) {
					for (int r = 1; r <= j; r ++) {
						if (l < i || r < j) {
							// cout << "cjmk\n";
							f[i][j] -= f[l][r] * c[i][l] % mod * c[j][r] % mod;
							f[i][j] += mod;
							f[i][j] %= mod;
						}
					}
				}
				// cout << f[i][j] <<  ' ';
			}
			// cout << '\n';
		}
		for (int i = 1; i <= n; i ++) {
			for (int j = 1; j <= m; j ++) {
				for (int l = 0; l < i; l ++) {
					for (int r = 0; r < j; r ++) {
						int t1 = i - l, t2 = j - r;
						if (t1 * t2 < a) continue;
						// cout << "cj\n";
						dp[i][j][k] += dp[l][r][k - 1] * f[t1][t2] % mod * c[n - l][t1] % mod * c[n - r][t2] % mod;
						dp[i][j][k] %= mod;
					}
				}
			}
		}
	}
	int ans = 0;
	for (int i = 1; i <= n; i ++) {
		for (int j = 1; j <= m; j ++) {
			ans += dp[i][j][cc];
			ans = (ans + mod) % mod;
		}
	}
	cout << (ans + mod) % mod;
	return 0;
}
2025/7/1 22:39
加载中...