Автор проблеми: | Хасан Салех (MathModel) |
Підготовлено: | Хасан Салех (MathModel) |
Редаговано: | Хасан Салех (MathModel) |
Рішення
Нехай буде перестановкою з \{1,2,\dots,n\}. Умова
залежить лише від парності елементів, оскільки парні числа вносять за модулем , а непарні числа вносять .
Визначимо бінарний масив довжини :
Тоді умова стає:
Отже, кожне вікно довжини масиву має непарну кількість одиниць.
Ключова властивість: періодичність
Нехай
Нам потрібно, щоб S_i=1 для всіх допустимих . Порівняємо сусідні вікна:
Оскільки S_i=S_{i+1}=1, ми отримуємо
Отже, є -періодичним. Таким чином, повністю визначається шаблоном довжини :
Нехай t=\sum_{j=0}^{k-1} b_j буде кількістю одиниць в одному періоді. Сума будь-якого вікна довжини дорівнює точно , тому умова виконується, якщо:
Відповідність кількості непарних
У перестановці кількість непарних значень фіксована:
Отже, ми повинні скласти з точно одиниць.
Запишемо n=qk+r з 0\le r<k. -періодичний рядок містить:
q\cdot t одиниць з повних періодів,
плюс одиниць з перших позицій шаблону, де x=\sum_{j=0}^{r-1} b_j.
Отже, нам потрібно:
Знаючи , ми маємо x=O-q\cdot t. Тепер нам потрібно лише перевірити, чи може шаблон з точно одиницями мати точно одиниць у своїх перших позиціях.
Доступний діапазон для
Ми вибираємо одиниць серед позицій; перші позицій є префіксом.
Максимум одиниць у префіксі: \min(r,t).
Мінімум одиниць у префіксі: якщо ми розмістимо якомога більше одиниць поза префіксом (є k-r позицій), то принаймні t-(k-r) одиниць повинні бути всередині, тому:
Отже, для даного непарного можливість:
Ми пробуємо непарні t\in\{1,3,5,\dots,k\} і беремо перше можливе. Якщо нічого не підходить, відповідь .
Складання шаблону
Після вибору :
Розмістіть одиниць у префіксних позиціях 0,1,\dots,x-1 (щоб префікс мав точно одиниць).
Залишилися t-x одиниць повинні бути розміщені поза префіксом (індекси r,\dots,k-1), щоб зберегти кількість одиниць у префіксі незмінною.
Складання перестановки
Підготуйте два списки:
всі непарні числа в порядку зростання,
всі парні числа в порядку зростання.
Для позиції i=0..n-1:
якщо b[i\bmod k]=1, розмістіть наступне непарне,
інакше розмістіть наступне парне.
Це створює перестановку (кожне число використано один раз), і за конструкцією парність шаблону є -періодичною з непарною сумою періоду, тому сума кожного вікна довжини є непарною.
Складність
Для кожного тесту ми пробуємо максимум значень з кроком , тобто , і будуємо перестановку за . Зважаючи на \sum n\le 10^6, загальний час є лінійним.
Референсний код (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)