โจทย์: กำหนด N และ K หา N จำนวนที่ไม่ซ้ำกัน ที่ bitwise OR ของทั้งหมดเท่ากับ K ถ้าไม่ได้ → คืน -1
ตัวอย่าง: N=4, K=6 (binary 110) → [6, 0, 1, 2] เพราะ 6|0|1|2 = 6
อัลกอริทึม
- นับจำนวนบิต 1 ใน K (cnt_k)
- จำนวนชุดย่อยของบิต 1 = 2^cnt_k ต้อง ≥ N ไม่งั้น impossible
- สร้างตัวเลขจากชุดย่อยของบิตที่เป็น 1 ใน K (ใช้ visited array กันซ้ำ)
- ใส่ K เองเป็นตัวแรก แล้วเติมจากชุดย่อยจนครบ N ตัว
ตัวอย่างโค้ด
MAX = 32
visited = [False] * MAX
res = []
def set_bit_count(n):
if n == 0: return 0
return (n & 1) + set_bit_count(n >> 1)
def add(num):
value = 0
for i in range(MAX):
if visited[i]: continue
if num & 1:
value += (1 << i)
num //= 2
res.append(value)
def solve(n, k):
pow2 = [2**i for i in range(MAX)]
res.append(k)
cnt_k = set_bit_count(k)
if pow2[cnt_k] < n:
return -1
count = 0
for i in range(pow2[cnt_k] - 1):
add(i)
count += 1
if count == n:
break
return res
print(solve(4, 6)) # [6, 0, 1, 2]
ผลลัพธ์
[6, 0, 1, 2]
สรุป: ใช้คุณสมบัติ bitwise OR: ผลลัพธ์มีบิต 1 เฉพาะตำแหน่งที่ K มีบิต 1 → ตัวเลขที่ใช้ได้ต้องเป็นชุดย่อยของบิต 1 ใน K