| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 485547 | ak2006 | 아름다운 순열 (IZhO12_beauty) | C++14 | 1349 ms | 172764 KiB | 
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vb = vector<bool>;
using vvb = vector<vb>;
using vi = vector<int>;
using vvi = vector<vi>;
using vl = vector<ll>;
using vvl = vector<vl>;
using vc = vector<char>;
using vvc = vector<vc>;
using vs = vector<string>;
const ll mod = 1e9 + 7,inf = 1e18;
#define pb push_back
#define fast ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
void setIO()
{
    fast;
}
int main()
{
    setIO();
    int n;
    cin>>n;
    vi a(n),cnt2(n),cnt3(n);
    vvb adj(n,vb(n,false));
    for (int i = 0;i<n;i++){
        cin>>a[i];
        int x = a[i];
        while (x > 0){
            cnt2[i] += (x%2 == 1);
            x /= 2;
        }
        x = a[i];
        while (x > 0){
            cnt3[i] += (x%3 == 1);
            x /= 3;
        }
    }
    
    for (int i = 0;i<n;i++){
        for (int j = 0;j<n;j++){
            if (i == j)continue;
            adj[i][j] = (cnt2[i] == cnt2[j] or 
                cnt3[i] == cnt3[j]);
        }
    }
    
    vvl dp(n,vl(1<<n,0));
    for (int i = 0;i<n;i++)
        dp[i][(1<<i)] = 1;
    
    for (int mask = 0;mask<(1<<n);mask++){
        for (int i = 0;i<n;i++){
            if (!(mask & (1<<i)))continue;
            for (int j = 0;j<n;j++){
                if (!(mask & (1<<j)))
                    assert(dp[j][mask - (1<<i)] == 0);
                if (adj[i][j])
                    dp[i][mask] += 
                        dp[j][mask - (1<<i)];
            }
        }
    }
    ll ans = 0;
    for (int i = 0;i<n;i++)
        ans += dp[i][(1<<n) - 1];
    cout<<ans<<"\n";
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
