我的 DFS 暴力哪里错了啊
  • 板块灌水区
  • 楼主GI录像机
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/5/1 18:37
  • 上次更新2023/10/28 02:28:43
查看原帖
我的 DFS 暴力哪里错了啊
142969
GI录像机楼主2022/5/1 18:37

刚刚结束的月赛 T4,我的 DFS 调了 2h 都没有调出来,痛失五分,求各位大佬看看哪错了:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int read() {
	int f = 1, x = 0;
	char c = getchar();
	while (c < '0' || c > '9') {
		if (c == '-')f = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		x = x * 10 + c - '0';
		c = getchar();
	}
	return f * x;
}
void write(int x) {
	if (x < 0) {
		putchar('-');
		x = -x;
	}
	if (x > 9)write(x / 10);
	putchar(x % 10 + '0');
}
const int N = 5010, MOD = 998244353;
int n = read(), a[N], b[N], chose[N], ans;
bool vis[N];
void dfs(int now) {
	if (now == n + 1) {
		int tmp = 1;
		for (int i = 1; i <= n; i++) {
			tmp *= min(a[i], b[chose[i]]);
			tmp %= MOD;
		}
		ans += tmp;
		ans %= MOD;
		return;
	}
	for (int i = 1; i <= n; i++) {
		if (vis[i])continue;
		vis[i] = 1;
		chose[now] = i;
		dfs(now + 1);
		vis[i] = 0;
	}
}
signed main() {
	for (int i = 1; i <= n; i++)a[i] = read();
	for (int i = 1; i <= n; i++)b[i] = read();
	if (n > 8) {
		int ttmp = 1;
		for (int i = 1; i <= n; i++) {
			ttmp *= b[i];
			ttmp %= MOD;
		}
		write(ttmp);
		return 0;
	}
	dfs(1);
	for (int i = 1; i <= n; i++)ans /= i;
	write(ans);
	return 0;
}
2022/5/1 18:37
加载中...