Submission #638858

#TimeUsernameProblemLanguageResultExecution timeMemory
638858MohamedAhmed04Beautiful row (IZhO12_beauty)C++14
100 / 100
870 ms127560 KiB
#include <bits/stdc++.h>

using namespace std ;

const int MAX = 20 ;

int arr[MAX] ;
int n ;

int cnt2[MAX] , cnt3[MAX] ;

int calc(int x)
{
	int cnt = 0 ;
	while(x > 0)
	{
		cnt += (x%3 == 1) ;
		x /= 3 ;
	}
	return cnt ;
}

long long dp[MAX][(1 << MAX)] ;

int main()
{
	ios_base::sync_with_stdio(0) ;
	cin.tie(0) ;
	cin>>n ;
	for(int i = 0 ; i < n ; ++i)
		cin>>arr[i] ;
	for(int i = 0 ; i < n ; ++i)
		cnt2[i] = __builtin_popcount(arr[i]) , cnt3[i] = calc(arr[i]) ;
	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))))
					continue ;
				if(cnt2[i] == cnt2[j] || cnt3[i] == cnt3[j])
					dp[i][mask] += dp[j][mask ^ (1 << i)] ;
			}
		}
	}
	long long ans = 0 ;
	for(int i = 0 ; i < n ; ++i)
		ans += dp[i][(1 << n) - 1] ;
	return cout<<ans<<"\n" , 0 ;
}		
#Verdict Execution timeMemoryGrader output
Fetching results...