답안 #338548

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
338548 2020-12-23T11:33:55 Z tengiz05 아름다운 순열 (IZhO12_beauty) C++17
100 / 100
950 ms 189292 KB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define FASTIO ios_base::sync_with_stdio(false); cin.tie(NULL);
#define all(x) (x).begin(), (x).end()
#define pb push_back
#define pii pair<int, int>
#define ff first
#define ss second
#define PI acos(-1)
#define ld long double
template<class T> bool ckmin(T& a, const T& b) {return a>b? a=b, true:false;}
template<class T> bool ckmax(T& a, const T& b) {return a<b? a=b, true:false;}
const int mod = 1e9+7, N = 23;
int msb(int val){return sizeof(int)*8-__builtin_clzll(val)-1;}
int a[N], n, m, k;

bool iseq(int a, int b){
	if(__builtin_popcount(a) == __builtin_popcount(b))return true;
	int c1=0, c2=0;
	while(a>0){
		c1 += (a%3==1);
		a/=3;
	}
	while(b>0){
		c2 += (b%3==1);
		b/=3;
	}
	return c1 == c2;
}

bool g[N][N];
int dp[1<<20][N];
void solve(int test_case){
	int i, j;
	cin >> n;
	for(i=0;i<n;i++){
		cin >> a[i];
	}
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			if(i == j)continue;
			if(iseq(a[i], a[j]))g[i][j] = 1;
		}
	}
	for(i=0;i<(n);i++)dp[1<<i][i] = 1;
	for(int mask = 1; mask < (1<<n); mask++){
		for(i=0;i<n;i++){
			if(mask&(1<<i)){
				for(j=0;j<n;j++){
					if(i != j && g[i][j] && (mask&(1<<j))){
						dp[mask][i] += dp[mask^(1<<i)][j];
					}
				}
			}
		}
	}
	int ans = 0;
	//for(i=1;i<(1<<n);i++){for(j=0;j<n;j++)cout << dp[i][j] << ' ';cout << '\n';}
	for(i=0;i<n;i++){
		ans += dp[(1<<n)-1][i];
	}
	cout << ans << '\n';
	return;
}

signed main(){
	FASTIO;
#define MULTITEST 0
#if MULTITEST
	int _T;
	cin >> _T;
	for(int T_CASE = 1; T_CASE <= _T; T_CASE++)
		solve(T_CASE);
#else
	solve(1);
#endif
	return 0;
}




# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB Output is correct
2 Correct 0 ms 364 KB Output is correct
3 Correct 0 ms 364 KB Output is correct
4 Correct 1 ms 384 KB Output is correct
5 Correct 1 ms 364 KB Output is correct
6 Correct 1 ms 492 KB Output is correct
7 Correct 1 ms 492 KB Output is correct
8 Correct 1 ms 492 KB Output is correct
9 Correct 1 ms 492 KB Output is correct
10 Correct 1 ms 492 KB Output is correct
11 Correct 10 ms 3308 KB Output is correct
12 Correct 10 ms 3308 KB Output is correct
13 Correct 46 ms 12268 KB Output is correct
14 Correct 209 ms 47468 KB Output is correct
15 Correct 185 ms 47596 KB Output is correct
16 Correct 191 ms 47596 KB Output is correct
17 Correct 201 ms 47468 KB Output is correct
18 Correct 170 ms 47468 KB Output is correct
19 Correct 950 ms 189292 KB Output is correct
20 Correct 842 ms 189068 KB Output is correct