Problem Müəllifi: | Hasan Saleh (MathModel) |
Hazırlayan: | Hasan Saleh (MathModel) |
Redaktə edən: | Hasan Saleh (MathModel) |
Həll
-ni \{1,2,\dots,n\} dəstinin bir permutasiya olaraq götürək. Şərt
yalnız elementlərin cütlüyündən asılıdır, çünki cüt ədədlər -yə modulu verir və tək ədədlər verir.
Uzunluğu olan ikili bir massiv təyin edin:
Onda şərt belə olur:
Beləliklə, -nin hər uzunluğu olan pəncərəsində tək sayda olmalıdır.
Əsas xüsusiyyət: dövriyyət
Tutaq ki,
Biz S_i=1 olmasını istəyirik, bütün etibarlı üçün. Ardıcıllıq pəncərələrini müqayisə edək:
Çünki S_i=S_{i+1}=1, biz alırıq
Beləliklə, -dövridir. Buna görə də, tam olaraq uzunluğu olan bir naxış ilə müəyyən edilir:
Tutaq ki, t=\sum_{j=0}^{k-1} b_j bir dövr içində -lərin sayıdır. Hər uzunluğu olan pəncərənin cəmi tam olaraq -dir, buna görə də şərt yalnız:
Tək sayıların uyğunluğu
Permutasiya içində tək dəyərlərin sayı sabitdir:
Beləliklə, -ni tam olaraq ədəd ilə qurmalıyıq.
n=qk+r yazın, burada 0\le r<k. -dövrü olan string aşağıdakılardan ibarətdir:
q\cdot t ədəd tam dövründən,
üstəlik ədəd naxışın ilk mövqesindən, burada x=\sum_{j=0}^{r-1} b_j.
Beləliklə, bizə lazım olan:
Verilmiş üçün, x=O-q\cdot t olur. İndi yalnız -in ilk mövqedə tam olaraq ədəd olan bir naxışın olub-olmadığını yoxlamaq lazımdır.
Mümkün aralıq üçün
Biz mövqedən ədəd seçirik; ilk mövqelər prefiksdir.
Prefiksdə maksimum sayı: \min(r,t).
Prefiksdə minimum sayı: əgər mümkün qədər çox -i prefikdən kənarda yerləşdirsək (oradakı k-r mövqelər var), onda ən azı t-(k-r) ədəd prefikdə olmalıdır, beləliklə:
Beləliklə, verilmiş tək üçün, mümkünlük:
Biz -ni 1,3,5,\dots,k tək ədədlərdən sınayırıq və ilk mümkün olanı götürürük. Əgər heç biri işləmir, cavab -dir.
Naxış -ni qurmaq
seçdikdən sonra:
Prefiks mövqelərində 0,1,\dots,x-1 ədəd yerləşdirin (beləliklə prefiks tam olaraq ədəd -ə malikdir).
Qalan t-x ədəd prefiksdən kənarda yerləşdirilməlidir (indeks r,\dots,k-1) prefiks sayını dəyişməmək üçün.
Permutasiya qurmaq
İki siyahı hazırlayın:
artan sırada bütün tək ədədlər,
artan sırada bütün cüt ədədlər.
İndeks i=0..n-1 üçün:
əgər b[i\bmod k]=1 isə, növbəti tək ədədi yerləşdirin,
əks halda növbəti cüt ədədi yerləşdirin.
Bu, bir permutasiya yaradır (hər ədəd bir dəfə istifadə olunur) və quruluşuna görə cütlük naxışı -dövridir, beləliklə, hər uzunluğu olan pəncərə cəmi təkdir.
Komplekslik
Hər test üçün, biz dəyərini addım ilə sınayırıq, yəni , və permutasiyanı -də qururuq. Verilmiş \sum n\le 10^6, ümumi vaxt xətti olur.
İstinad kodu (Python)
for _ in range(int(input())):
n,k=map(int,input().split())
O=(n+1)//2
q,r=divmod(n,k)
t=x=-1
for T in range(1,k+1,2):
X=O-q*T
if X<0: continue
if max(0,T-(k-r))<=X<=min(r,T):
t,x=T,X
break
if t<0:
print(-1)
continue
b=[0]*k
for i in range(x): b[i]=1
y=t-x
for i in range(r,k):
if y==0: break
b[i]=1; y-=1
odds=list(range(1,n+1,2))
evens=list(range(2,n+1,2))
oi=ei=0
ans=[]
for i in range(n):
if b[i%k]:
ans.append(odds[oi]); oi+=1
else:
ans.append(evens[ei]); ei+=1
print(*ans)