Розстановка коней програмування

Власне кажучи є завдання:

Знайдіть кількість способів розставити на шаховій дошці розміром N * N рівно K коней таким чином, щоб жоден з них не бив іншого. Всі коні однакові, тому якщо в якийсь розстановці поміняти місцями двох коней, то це буде та ж сама розстановка.







Вхідні дані
У єдиному рядку знаходяться два цілих числа N (1 <= N <= 6) и K (0 <= K <= N*N).

Вихідні дані
Виведіть шукану кількість способів.

Зробив завдання за допомогою рекурсивного перебору:

Var
a, c: array # 91; 0..20,0..20 # 93; of integer;
q, fact, result, j, i, k, n: longint;






dx: array # 91; 0..7 # 93; of integer = (- 2, -1, 1, 2, 2, 1, -1, -2);
dy: array # 91; 0..7 # 93; of integer = (1, 2, 2, 1, -1, -2, -2, -1);

procedure move (x, y, d: integer); // функція визначає всі клітини, які б'є кінь на координатах x і y
Var i: integer;
begin
for i: = 0 to 7 do
if (x + dx # 91; i # 93;> = 0) and (x + dx # 91; i # 93;= 0) and (y + dy # 91; i # 93;inc (a # 91; x + dx # 91; i # 93;, y + dy # 91; i # 93; # 93;, d)
end;

procedure solve (size: integer); // сам перебір
var
i, j: longint;
begin
if q = 1 then exit;

if size = k then
begin
inc (result);
end
else

for i: = 0 to n-1 do
for j: = 0 to n-1 do begin a # 91; i, j # 93;: = 0; c # 91; i, j # 93;: = 0; end;

fact: = 1;
for i: = 1 to k do
fact: = fact * i;

writeln (result div fact);


Так ось, алгоритм працює, однак не вкладається в бажаний час через те, що я враховую "однакові" (за умовою завдання) розстановки. Хотілося б дізнатися спосіб, який би дозволив вирішити цю проблему.