Problem Müəllifi: | Hasan Saleh (MathModel) |
Hazırlayan: | Hasan Saleh (MathModel) |
Redaktə edən: | Hasan Saleh (MathModel) |
Həll
Bir ədəd -ni bəzi "-xüsusi" ədədlərin xor-u kimi ifadə etmək istəyirik. -xüsusi ədəd, ikili formasında dəqiq ardıcıl olan və bütün digər bitləri olan hər hansı bir ədəddir, yəni
bəzi t \ge 0 sürüşməsi üçün. Başqa sözlə, bu, bitləri t, t+1, \dots, t+k-1 birlikdə dəyişir. Bizim əməliyyatımız xor-dur, beləliklə, eyni biti iki dəfə dəyişmək ləğv edir.
Əsas müşahidə budur ki, bu əməliyyat bitlərdə soldan sağa (əslində aşağıdan yuxarıya) bir istiqamətdədir. -nin bitlərinə ən az əhəmiyyətli bitdən yuxarıya baxın. Tutaq ki, biz hazırda bitindəyik və bütün əvvəlki əməliyyatlardan sonra bitlər 0,1,\dots,i-1 artıq olub. Əgər biti -dırsa, heç nə etməyə ehtiyac yoxdur. Əgər biti -dirsə, -də tam olaraq başlayan -blokunu istifadə etməyə məcburuq:
-dən sonra başlayan hər hansı blok bitinə toxunmayacaq,
-dən əvvəl başlayan hər hansı blok bitinə toxunacaq və artıq düzəltdiyimizi yenidən pozacaq,
beləliklə, bitini kiçik bitləri məhv etmədən təmizləməyin yeganə qanuni yolu xor etməkdir
Bunu etdikdən sonra, biti olur və i+1,\dots,i+k-1 bitləri dəyişir; sonra növbəti bitə keçirik.
Beləliklə, alqoritm tam olaraq belədir:
-ni ikili formada yazın (saxlamaq üçün kifayət qədər bitdən az),
i=0,1,2,\dots üçün i+k \le 64 olduğu müddətcə:
əgər biti -dirsə, onda -də başlayan bloku götürün, cavaba əlavə edin və işçi nüsxəmizə xor edin,
bütün mümkün başlanğıcları etdikdən sonra, əgər yuxarıdakı (k-1) bitlərdə hər hansı bir qalıbsa, bu mümkün deyil (onu örtmək üçün kifayət qədər yüksək başlayacaq blok yoxdur), beləliklə cavab -dir,
əks halda, götürdüyümüz bloklar tam olaraq bir etibarlı quruluşdur.
Niyə bu minimaldır? Çünki hər dəfə -lə rastlaşdığımızda seçimimiz yox idi: o orada məhv edilməlidir. Beləliklə, hər hansı bir həll o bloku ehtiva etməlidir. Hər seçilmiş blok məcbur olduğuna görə, hər hansı bir həll eyni blokların çoxluğuna malikdir beləliklə bu açgözlü minimal say verir və unikaldır.
Rəsmi olaraq, b_i-ni süzgəc zamanı bit -nin cari dəyəri ilə təyin etsək, b_i=1 olan hər bir üçün biz əlavə edirik
quruluşa, və b_{i+j} \mathrel{\oplus}=1 edirik 0 \le j < k. Sonda əgər t > 64-k olan bəzi b_t=1 varsa, çap edirik.
Komplekslik \mathcal{O}(\log^2 n)-dir.
def solve():
n,k=map(int,input().split())
b=n.bit_length()
a=[]
cur=0
for i in range(b):
bit=(n>>i)&1
x=bit^cur
a.append(x)
cur^=x
if i-k+1>=0:
cur^=a[i-k+1]
for j in range(1,k):
if b-j>=0 and a[b-j]:
print(-1)
return
base=(1<<k)-1
v=[base<<i for i,x in enumerate(a) if x]
print(len(v))
print(*v)
for _ in range(int(input())):
solve()