记录编号 607022 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 4178.排列 最终得分 100
用户昵称 Gravatar梦那边的美好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;
}