Fraction quruluş#12341

Fraction quruluş (Həll təhlili)

Problemin müəllifi:

Kxoy Le

Hazırlayan:

Kxoy Le

Redaktə edən:

Həsən Saleh (MathModel)

Qeyd: Lukas teoremi tək binomiyal əmsallar üçün sadə bir şərt təqdim edir.

Lukas teoremine görə, \binom{n}{k} \equiv 1 \pmod 2 yalnız və n-k-nın ikili sistemdə toplanması zamanı daşınmalar olmadıqda baş verir. Bu, k \text{ \& } (n-k) = 0 bit AND əməliyyatına bərabərdir, ya da daha sadə desək, k \text{ \& } n = k.

Gəlin kiçik dəyərlər üçün a_i, a_j \in \{1, 2, 3\} şərtini qiymətləndirək:

  • \binom{1}{1} = 1 (Tək)

  • \binom{2}{2} = 1 (Tək)

  • \binom{2}{1} = 2 (Cüt)

  • \binom{3}{3} = 1 (Tək)

  • \binom{3}{2} = 3 (Tək)

  • \binom{3}{1} = 3 (Tək)

Qeyd edin ki, yalnız dəyərini istifadə etdikdə, istənilən cütü -ya kömək edir. Lakin, və ya dəyərlərini daxil etdikdə, cütləri "sındıra" bilərik. Xüsusilə, dəyəri və ilə tək binomiyal əmsal yaradır. dəyəri yalnız digər və ya ilə tək əmsal yaradır. dəyəri yalnız digər və ya ilə tək əmsal yaradır. Vacibdir ki, cütü \binom{2}{1} = 2-yə səbəb olur ki, bu da cütdür.

Quruluş: Tam olaraq cütü əldə etmək üçün, ədəd dəyəri ilə başlayırıq, burada \binom{s}{2} \ge x. Bu, bizə \binom{s}{2} tək cüt verir. Bu sayı dəqiq -ə endirmək üçün, rem = \binom{s}{2} - x cütünü çıxarmalıyıq. Biz ədədini -dən -ə çevirə bilərik və ədədini -yə çevirə bilərik. Çünki cütü cütdür, tək -də olan ədədi ilə tək cüt yaratmayacaq, bu da ümumi sayı dəqiq qədər azaldır.

from collections import defaultdict as dd

def C(x): return (x*(x-1))//2

mp=dd(int)
for i in range(1,10**5):
    mp[(i*(i-1))//2]=i

def solve():
    x,y=map(int,input().split())
    if(y<=1):
        for i in range(1,int(2*(x**0.5))+2):
            if(C(i)==x):
                print(i)
                print(*([1]*i))
                return
    if(y==2):
        for c1 in range(1,10**5):
            t = x - C(c1)
            if(t >= 0 and mp[t]!=0):
                c2=mp[t]
                print(c1+c2)
                print(*([1]*c1+[2]*(c2)))
                return
    if(y>0):
        l,r=1,2*10**9
        s=r 
        while(l<=r):
            m=l+(r-l)//2
            if((m*(m-1))//2>=x):
                s=m
                r=m-1
            else:
                l=m+1
        rem=s*(s-1)//2-x 
        c1,c2,c3=0,0,0
        if(rem==0):
            c3=s
        else:
            c1=rem
            c2=1
            c3=s-c1-c2 
        print(int(c1+c2+c3))
        print(*([1]*int(c1)+[2]*int(c2)+[3]*int(c3)))
        return

for _ in range(int(input())):
    solve()