Problem Müəllifi: | Hasan Saleh (MathModel) |
Hazırlayan: | Hasan Saleh (MathModel) |
Redaktə edən: | Hasan Saleh (MathModel) |
Unutmayın ki, permutasiyanın maksimum cəmi heç bir şey etmədən öz permutasiyasıdır ki, bu da
ədədini -dən mənfi etmək deməkdir ki, S \rightarrow S-2x , bu, istənilən uzunluqdakı alt dəstinin cəmi üçün də keçərlidir, beləliklə, bir permutasiyanın mövcud olması üçün kifayət qədər şərtimiz var:
Beləliklə, mənfi ədədlərin alt dəstəsinin cəmini X=\frac{S-k}{2} olaraq əldə edə bilərik. Alt dəstənin cəmini məhdudlaşdıra bilərik, bu da ən azı
, və ən çox ədədini ən yüksəkdən
əldə edə bilərik. Əgər bu aralıqda məhdudlaşmırsa, onda belə bir permutasiyanın mövcud olmadığı açıqdır.
Nəhayət, ədədləri şirnikləndirərək seçə bilərik ki, həmişə növbəti hərəkətdə ədədlərlə oynamağa sahəmiz olsun.
Həll
for _ in range(int(input())):
n,m,k=map(int,input().split())
S=n*(n+1)//2
if (S-k)&1 or k>S:
print(-1); continue
X=(S-k)//2
lo=m*(m+1)//2
hi=S-(n-m)*(n-m+1)//2
if X<lo or X>hi:
print(-1); continue
neg=[False]*(n+1)
rem=m; target=X
for i in range(n,0,-1):
if rem==0: break
if target>=i and target-i>=(rem-1)*rem//2:
neg[i]=True
target-=i
rem-=1
if rem or target:
print(-1); continue
print(*(-i if neg[i] else i for i in range(1,n+1)))Komplekslik