In [ ]:
In [ ]:
import itertools
t = int(raw_input())
class Node(object):
def __init__(self, value=None):
self._value = value
self._smaller = None
self._bigger = None
def put(self, value):
if self._value is None:
self._value = value
return
if value <= self._value:
if self._smaller is None:
self._smaller = Node()
self._smaller.put(value)
else:
if self._bigger is None:
self._bigger = Node()
self._bigger.put(value)
def liking(self, alpha, beta):
return (self.even_sum() * alpha) - (self.odd_sum() * beta)
def even_sum(self):
return self._alternate_sum(False)
def odd_sum(self):
return self._alternate_sum(True)
def _alternate_sum(self, skip):
this = 0 if skip else self._value
smaller = self._smaller._alternate_sum(not skip) if self._smaller else 0
bigger = self._bigger._alternate_sum(not skip) if self._bigger else 0
return this + smaller + bigger
def hash(self):
s_hash = self._smaller.hash() if self._smaller else ''
b_hash = self._bigger.hash() if self._bigger else ''
return '[%s,[%s],[%s]]' % (self._value, s_hash, b_hash)
def test(n, a, alpha, beta):
liking_sum = 0
seen = set()
permutations = itertools.permutations(a)
for permutation in permutations:
tree = Node()
for i in permutation:
tree.put(i)
hash = tree.hash()
if hash not in seen:
liking_sum += tree.liking(alpha, beta)
seen.add(hash)
print liking_sum
for i in range(t):
n = int(raw_input())
alpha, beta = [int(x) for x in raw_input().split()]
a = [int(x) for x in raw_input().split()]
test(n, a, alpha, beta)