刚刚结束的月赛 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;
}