هايدورا والعصي#12297

هايدورا والعصي (شرح الحلول)

مؤلف المشكلة:

هايدارا المكديد

أعده:

هايدارا المكديد

حرره:

حسن صالح (MathModel)

الحل

من الأمثل البناء باستخدام البناء المثلثي أي نستمر في جمع الأعداد من إلى حتى يكون المجموع S \le x، نعلم أن مجموع أول أعداد هو:

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

لاحظ أن في تزايد!، وبالتالي يمكننا البحث الثنائي عن الحد الأقصى لـ بحيث T(m) \le m، مع الحدود l=1 و r=2 \cdot 10^9 والتي ستكون آمنة، حيث أن T(2 \cdot 10^9) > 2 \cdot 10^{18} وهو كافٍ لحل المشكلة ويتناسب أيضًا مع نطاق 'long long' في C++.

بمجرد أن نحصل على ، نأتي للعثور على أقصى طول عصا، ستكون الإجابة في هذه الحالة هي الحد الأقصى لـ — أكبر عدد صحيح استخدمناه في البناء المثلثي وأقصى الأعداد المتبقية، رسميًا

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

التعقيد \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()