İkili Əyləncə#12272

İkili Əyləncə (Həll təhlili)

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

x = \bigl((1 \ll k) - 1\bigr) \ll t

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

\bigl((1 \ll k) - 1\bigr) \ll i.

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:

  1. -ni ikili formada yazın (saxlamaq üçün kifayət qədər bitdən az),

  2. 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,

  3. 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,

  4. ə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

x_i = \bigl((1 \ll k) - 1\bigr) \ll i

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()