Вот простенькая программка на PARI/GP, которая строит полустроки для любого заданного четного порядка n:
Код:
{ semirows(n) = local(x,v);
if(n%2,error("Odd n"));
if(n%8==0 || n%8==6,
x=n/2; v=vector(n/2,i,i);
,
x=n/2+1; v=vector(n/2,i,if(i==n/2,i+1,i));
);
s=sum(j=1,#v,v[j])/2;
forstep(j=#v,1,-1,
if(s>=v[j], s-=v[j]; v[j]+=x, v[j]=x-v[j]);
);
[v,vector(#v,i,2*x-v[i])]
}
Стоит заметить, что если

при делении на 8 дает в остатке 0 или 6, то построенные полустроки содержает в точности числа от 0 до n, за исключением n/2. Если n дает в остатке 2 или 4, то такое невозможно - в этом случае построенные полустроки содержат числа от 0 до n+2, за исключением 1, n/2+1 и n+1.
Примеры полустрок для n в интервале от 10 до 30:
Код:
? forstep(n=10,30,2,print("n=",n,": ",semirows(n)))
n=10: [[5, 8, 3, 2, 12], [7, 4, 9, 10, 0]]
n=12: [[6, 5, 4, 11, 2, 14], [8, 9, 10, 3, 12, 0]]
n=14: [[8, 5, 4, 3, 2, 13, 14], [6, 9, 10, 11, 12, 1, 0]]
n=16: [[7, 6, 11, 4, 3, 2, 15, 16], [9, 10, 5, 12, 13, 14, 1, 0]]
n=18: [[9, 8, 7, 6, 15, 4, 3, 18, 20], [11, 12, 13, 14, 5, 16, 17, 2, 0]]
n=20: [[10, 9, 8, 7, 6, 5, 4, 19, 20, 22], [12, 13, 14, 15, 16, 17, 18, 3, 2, 0]]
n=22: [[10, 9, 14, 7, 6, 5, 4, 3, 20, 21, 22], [12, 13, 8, 15, 16, 17, 18, 19, 2, 1, 0]]
n=24: [[11, 10, 9, 8, 7, 18, 5, 4, 3, 22, 23, 24], [13, 14, 15, 16, 17, 6, 19, 20, 21, 2, 1, 0]]
n=26: [[13, 12, 11, 10, 9, 8, 7, 6, 23, 4, 25, 26, 28], [15, 16, 17, 18, 19, 20, 21, 22, 5, 24, 3, 2, 0]]
n=28: [[14, 17, 12, 11, 10, 9, 8, 7, 6, 5, 26, 27, 28, 30], [16, 13, 18, 19, 20, 21, 22, 23, 24, 25, 4, 3, 2, 0]]
n=30: [[14, 13, 12, 11, 10, 21, 8, 7, 6, 5, 4, 27, 28, 29, 30], [16, 17, 18, 19, 20, 9, 22, 23, 24, 25, 26, 3, 2, 1, 0]]