Advertisement
Guest User

Untitled

a guest
Mar 28th, 2020
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.14 KB | None | 0 0
  1. import bisect
  2. from collections import defaultdict
  3. from itertools import combinations
  4. import heapq
  5.  
  6.  
  7. def f(x):
  8. return min((bin(x * i).count('1'), i) for i in range(1, 100_000, 2))
  9.  
  10.  
  11. def solve_odd(m):
  12. assert m & 1
  13. powers_of_2 = {}
  14. power = 1
  15. exp = 0
  16. while power not in powers_of_2:
  17. powers_of_2[power] = exp
  18. power = (power * 2) % m
  19. exp += 1
  20. subset = alex_sum(powers_of_2, m)
  21. return sorted(map(powers_of_2.get, subset))
  22.  
  23.  
  24. def value(subset, powers_of_2):
  25. return sum(1 << powers_of_2[x] for x in subset)
  26.  
  27.  
  28. def alex_sum(powers_of_2, m):
  29. pos_sums = defaultdict(set)
  30. for pow in powers_of_2:
  31. pos_sums[pow].add(pow)
  32. while True:
  33. for p, val in range(pos_sums):
  34. for p2 in range(powers_of_2):
  35. s = (p + p2) % m
  36. a = pos_sums[p] # does this change pos_sums[p]? should not
  37. bisect.insort(a, p2)
  38. if pos_sums[s]:
  39. if len(pos_sums[s]) - len(a) == 0 and a < pos_sums[s]:
  40. pos_sums[s] = a
  41. elif p + p2 == 0:
  42. pos_sums[s] = a
  43. else:
  44. pos_sums[s] = [s]
  45. if pos_sums[0]:
  46. return pos_sums[0]
  47.  
  48.  
  49. def min_sum_to_zero(powers_of_2, m):
  50. for num_choices in range(1, len(powers_of_2) + 1):
  51. best = None
  52. best_value = float('inf')
  53. for subset in combinations(powers_of_2, num_choices):
  54. if sum(subset) % m == 0:
  55. val = value(subset, powers_of_2)
  56. if best is None or val < best_value:
  57. best = subset
  58. best_value = val
  59. if best is not None:
  60. return best
  61.  
  62.  
  63. def exponent_of_2(x):
  64. s = bin(x)
  65. return len(s) - len(s.rstrip('0'))
  66.  
  67.  
  68. def solve(m):
  69. even = exponent_of_2(m)
  70. odd = m >> even
  71. solution = [x + even for x in solve_odd(odd)]
  72. assert sum(1 << x for x in solution) % m == 0
  73. return solution
  74.  
  75.  
  76. def main():
  77. N = int(input())
  78. for _ in range(N):
  79. m = int(input())
  80. print(*solve(m))
  81.  
  82.  
  83. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement