답안 #917022

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
917022 2024-01-27T01:49:21 Z Whisper 아름다운 순열 (IZhO12_beauty) C++17
100 / 100
1714 ms 162648 KB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
using ld = long double;
using T = tuple<ll, ll, ll>;

#define int long long
#define Base 41
#define sz(a) (int)a.size()
#define FOR(i, a, b) for ( int i = a ; i <= b ; i++ )
#define FORD(i, a, b) for (int i = b; i >= a; i --)
#define REP(i, n) for (int i = 0; i < n; ++i)
#define REPD(i, n) for (int i = n - 1; i >= 0; --i)
#define all(x) x.begin() , x.end()
#define pii pair<int , int>
#define fi first
#define se second
#define Lg(x) 31 - __builtin_clz(x)

#define MASK(i) (1LL << (i))
#define BIT(x, i) (((x) >> (i)) & 1)

constexpr ll LINF = (1ll << 60);
constexpr int INF = (1ll << 30);
constexpr int MAX = 20;
constexpr int Mod = 1e9 + 7;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

void setupIO(){
    #define name "Whisper"
    //Phu Trong from Nguyen Tat Thanh High School for gifted student
    srand(time(NULL));
    cin.tie(nullptr)->sync_with_stdio(false); cout.tie(nullptr);
    //freopen(name".inp", "r", stdin);
    //freopen(name".out", "w", stdout);
    cout << fixed << setprecision(10);
}

template <class X, class Y>
    bool minimize(X &x, const Y &y){
        X eps = 1e-9;
        if (x > y + eps) {x = y; return 1;}
        return 0;
    }

template <class X, class Y>
    bool maximize(X &x, const Y &y){
        X eps = 1e-9;
        if (x + eps < y) {x = y; return 1;}
        return 0;
    }
int N;
int a[MAX];

int bin[MAX], ter[MAX];
int dp[MAX][MASK(20)];
void Whisper(){
    cin >> N;
    REP(i, N) cin >> a[i];
    for (int i = 0; i < N; ++i){
        bin[i] = __builtin_popcount(a[i]);
        int x = a[i];
        while (x > 0){
            int cur = (x % 3); x /= 3;
            if (cur == 1) ter[i]++;
        }
    }
    REP(i, N) dp[i][MASK(i)] = 1;

    REP(msk, MASK(N)){
        REP(i, N) if(!BIT(msk, i)){
            REP(j, N) if(BIT(msk, j) && i != j){
                if (bin[i] == bin[j] || ter[i] == ter[j])
                    dp[i][msk | MASK(i)] += dp[j][msk];
            }
        }
    }
    int ans = 0;
    REP(i, N){
        ans += dp[i][MASK(N) - 1];
    }
    cout << ans;
}


signed main(){
    setupIO();
    int Test = 1;
//    cin >> Test;
    for ( int i = 1 ; i <= Test ; i++ ){
        Whisper();
        if (i < Test) cout << '\n';
    }
}

# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2392 KB Output is correct
2 Correct 1 ms 4596 KB Output is correct
3 Correct 1 ms 6492 KB Output is correct
4 Correct 1 ms 6492 KB Output is correct
5 Correct 1 ms 6492 KB Output is correct
6 Correct 3 ms 18928 KB Output is correct
7 Correct 4 ms 18932 KB Output is correct
8 Correct 4 ms 18780 KB Output is correct
9 Correct 4 ms 18780 KB Output is correct
10 Correct 3 ms 18932 KB Output is correct
11 Correct 12 ms 27216 KB Output is correct
12 Correct 10 ms 27264 KB Output is correct
13 Correct 52 ms 62032 KB Output is correct
14 Correct 233 ms 66288 KB Output is correct
15 Correct 314 ms 66500 KB Output is correct
16 Correct 210 ms 66288 KB Output is correct
17 Correct 234 ms 66284 KB Output is correct
18 Correct 181 ms 66140 KB Output is correct
19 Correct 1264 ms 162648 KB Output is correct
20 Correct 1714 ms 162576 KB Output is correct