Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import bisect
- from collections import defaultdict
- from itertools import combinations
- import heapq
- def f(x):
- return min((bin(x * i).count('1'), i) for i in range(1, 100_000, 2))
- def solve_odd(m):
- assert m & 1
- powers_of_2 = {}
- power = 1
- exp = 0
- while power not in powers_of_2:
- powers_of_2[power] = exp
- power = (power * 2) % m
- exp += 1
- subset = alex_sum(powers_of_2, m)
- return sorted(map(powers_of_2.get, subset))
- def value(subset, powers_of_2):
- return sum(1 << powers_of_2[x] for x in subset)
- def alex_sum(powers_of_2, m):
- pos_sums = defaultdict(set)
- for pow in powers_of_2:
- pos_sums[pow].add(pow)
- while True:
- for p, val in range(pos_sums):
- for p2 in range(powers_of_2):
- s = (p + p2) % m
- a = pos_sums[p] # does this change pos_sums[p]? should not
- bisect.insort(a, p2)
- if pos_sums[s]:
- if len(pos_sums[s]) - len(a) == 0 and a < pos_sums[s]:
- pos_sums[s] = a
- elif p + p2 == 0:
- pos_sums[s] = a
- else:
- pos_sums[s] = [s]
- if pos_sums[0]:
- return pos_sums[0]
- def min_sum_to_zero(powers_of_2, m):
- for num_choices in range(1, len(powers_of_2) + 1):
- best = None
- best_value = float('inf')
- for subset in combinations(powers_of_2, num_choices):
- if sum(subset) % m == 0:
- val = value(subset, powers_of_2)
- if best is None or val < best_value:
- best = subset
- best_value = val
- if best is not None:
- return best
- def exponent_of_2(x):
- s = bin(x)
- return len(s) - len(s.rstrip('0'))
- def solve(m):
- even = exponent_of_2(m)
- odd = m >> even
- solution = [x + even for x in solve_odd(odd)]
- assert sum(1 << x for x in solution) % m == 0
- return solution
- def main():
- N = int(input())
- for _ in range(N):
- m = int(input())
- print(*solve(m))
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement