제출 #716435

#제출 시각아이디문제언어결과실행 시간메모리
716435vjudge1아름다운 순열 (IZhO12_beauty)C++17
100 / 100
2531 ms164556 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxn = 5e5 + 100;
const int mod = (int)1e9+7;
int n;
int a[maxn];
int g[22][22];
ll dp[1<<20][20];

int ter(int x) {
    int cnt = 0;
    while(x > 0) {
        if(x % 3 == 1) cnt++;
        x /= 3;
    }
    return cnt;
}
ll rec(int mask, int last) {
    if(__builtin_popcount(mask) == n) {
        return 1;
    }
    if(dp[mask][last] != -1) return dp[mask][last];
    dp[mask][last] = 0;
    for(int i = 0; i < n; i++) {
        if(g[last][i] && !(mask & (1<<i))) {
            dp[mask][last] += rec(mask|1<<i, i);
        }
    }
    return dp[mask][last];
}
int main() {
    ios_base::sync_with_stdio(false);

    cin >> n;
    for(int i = 0; i < n; i++) {
        cin >> a[i];
    }
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            if(__builtin_popcount(a[i]) == __builtin_popcount(a[j])) {
                g[i][j] = 1;
            } else {
                if(ter(a[i]) == ter(a[j])) {
                    g[i][j] = 1;
                }
            }
        }
    }
    memset(dp, -1, sizeof dp);
    ll ans = 0;
    for(int i = 0; i < n; i++) {
        ans += rec(1<<i, i);
    }
    cout << ans << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...