제출 #1176723

#제출 시각아이디문제언어결과실행 시간메모리
1176723attky아름다운 순열 (IZhO12_beauty)C++20
0 / 100
3095 ms528 KiB
#include <bits/stdc++.h>

using namespace std;

int vu = 0, nb[20], n, compteur = 0;
vector<int> graph[20];

int nbOneBin(int a) {
    int compteur1 = 0;
    for(int loop = 30; loop >= 0; --loop) {
        if(a >= (1 << loop)) {
            a -= (1 << loop);
            compteur1++;
        }
    }
    return compteur1;
}

int nbOneTer(int a) {
    int compteur1 = 0;
    for(int loop = 18; loop >= 0; --loop) {
        if(a >= 2*int(pow(3, loop))) {
            a -= 2*int(pow(3, loop));
        }
        else if(a >= int(pow(3, loop))) {
            a -= int(pow(3, loop));
            compteur1++;
        }
    }
    return compteur1;
}

void dfs(int pos) {
    vu = vu | (1 << pos);
    if(vu == (1 << n) - 1) {
        compteur++;
    }
    else {
        for(int loop = 0; loop < graph[pos].size(); ++loop) {
            if((vu | (1 << graph[pos][loop])) != vu) {
                dfs(graph[pos][loop]);
            }
        }
    }
    vu -= (1 << pos);
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> n;
    for(int loop = 0; loop < n; ++loop) {
        cin >> nb[loop];
    }
    for(int loop = 0; loop < n; ++loop) {
        for(int looping = loop+1; looping < n; ++looping) {
            if(nbOneBin(nb[loop]) == nbOneBin(nb[looping]) || nbOneTer(nb[loop]) == nbOneTer(nb[looping])) {
                graph[loop].push_back(looping);
                graph[looping].push_back(loop);
            }
        }
    }
    for(int loop = 0; loop < n; ++loop) {
        dfs(loop);
    }
    cout << compteur << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...