Haidora və çubuqlar#12297

Haidora və çubuqlar (Həll təhlili)

Problem Müəllifi:

Haidara Al Makdid

Hazırlayan:

Haidara Al Makdid

Redaktə edən:

Hasan Saleh (MathModel)

Həll

Üçbucaq Quruluşu ilə qurmaq optimaldır, yəni -dən -ə qədər ədədləri toplamağa davam edirik ki, cəmi S \le x olsun. Biz bilirik ki, ilk tam ədədin cəmi:

\displaystyle T(m)=\sum_{i=1}^m i = \frac{m(m+1)}{2}

Qeyd edin ki, artır! , buna görə də T(m) \le m olan maksimum üçün ikili axtarış edə bilərik, sərhədlər l=1 və r=2 \cdot 10^9 olacaq ki, bu da təhlükəsizdir, çünki T(2 \cdot 10^9) > 2 \cdot 10^{18}-dir ki, bu da problemi həll etmək üçün kifayətdir və həmçinin C++ üçün uzun 'long long' aralığına uyğundur.

-ni əldə etdikdən sonra maksimum çubuq uzunluğunu tapmağa gəlirik, bu halda cavab -nin maksimumu olacaq — üçbucaq quruluşunda istifadə etdiyimiz ən böyük tam ədəd və qalan tam ədədlərin maksimumu, rəsmi olaraq

\max(m,n-T(m-1))

Komplekslik \mathcal{O}(\log(2\cdot 10^9) \cdot t).

def T(n):return (n*(n+1))//2

def solve():
    n=int(input())
    l,r=1,2*10**9
    while(l<=r):
        m=(l+r)//2
        if(T(m)<n<T(m+1)):
            ans=m+1
            break
        if(T(m)==n):
            ans=m
            break
        if(T(m)<n):
            l=m+1
        if(T(m)>n):
            r=m-1
    if(T(ans)>n):ans-=1
    print(ans,max(ans,n-T(ans-1)))

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