记录编号 |
607022 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
4178.排列 |
最终得分 |
100 |
用户昵称 |
梦那边的美好WA |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.617 s |
提交时间 |
2025-10-04 21:27:30 |
内存使用 |
5.33 MiB |
显示代码纯文本
#include <iostream>
using namespace std;
const int mod = 1e9 + 7;
int a[25], cnt[25][25];
int dp[2097152], count[25];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
freopen("changgao_perm.in", "r", stdin);
freopen("changgao_perm.out", "w", stdout);
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
a[i]--;
}
for (int i = 0; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cnt[i][j] = cnt[i][j - 1];
if (a[j] > i)
cnt[i][j]++;
}
}
dp[0] = 1;
for (int k = 0; k < (1 << n); k++) {
if (dp[k] == 0)
continue;
int l = __builtin_popcount(k);
for (int i = 0; i < n; i++) {
if (k & (1 << i)) {
for (int j = 0; j < i; j++) {
count[j]++;
}
}
}
for (int i = 0; i < n; i++) {
if (k >> i & 1)
continue;
for (int j = 0; j < i; j++) {
count[j]++;
}
bool ok = 1;
for (int j = 0; j < n; j++) {
if (count[j] > cnt[j][l + 1]) {
ok = false;
break;
}
}
if (ok) {
dp[k | (1 << i)] = (dp[k | (1 << i)] + dp[k]) % mod;
}
for (int j = 0; j < i; j++) {
count[j]--;
}
}
for (int i = 0; i < n; i++) {
if (k & (1 << i)) {
for (int j = 0; j < i; j++) {
count[j]--;
}
}
}
}
cout << dp[(1 << n) - 1];
return 0;
}