mask & (1<<j) # check
mask ^ (1<<j) # remove
mask | (1<<j) # set
Arrangements max/min/cnt
def dp(mask, i):
if i == n:
return 0
res = inf
for j in range(n):
if mask & (1<<j):
res = min(res, dp(mask ^ (1<<j), i + 1) + (nums1[i] ^ nums2[j]))
return res
return dp((1<<n) - 1, 0)
def dfs(mask, prev):
if mask == 0:
return 1
res = 0
for i in range(n):
if mask & (1 << i) and (nums[i] % prev == 0 or prev % nums[i] == 0):
res += dfs(mask ^ (1 << i), nums[i],)
return res
return dfs((1 << n) - 1, 1)
def dp(mask, cnt):
if mask == (1 << n) - 1:
return 1
res = 0
for i in range(n):
if not (mask & (1 << i)) and (cnt % (i+1) == 0 or (i+1) % cnt == 0):
res += dp(mask | (1 << i), cnt + 1)
return res
return dp(0, 1)