Я решаю довольно тривиальную задачу, хочу разобраться. Нужно найти количество способов, коими на доске N*N можно расставить K ладей. Когда N=K - то всё понятно, на первой горизонтали можно поставить ладью N способами, на второй - N-1, и так далее, и в итоге количество вариантов равно N!. Тут же проблема в том, что N и K - числа от 1 до 8, и N может быть больше K. Я не знаю, какую формулу применить. Набросал код:
{$APPTYPE CONSOLE}
var n,k:byte;
function fact(n:byte):int64;
begin
if n=0 then result:=1 else result:=n*fact(n-1);
end;
begin
assign(input,'input.txt');
read(n,k);
assign(output,'output.txt');
if (k>0) then writeln((fact(n)*fact(n)) div fact(k)) else writeln(0); //можно конечно вычислять N! 1 раз
end.
, он правильно работает для входных данных 8 8, 8 7 (N и K соответственно), да и на некоторых других вроде как тоже правильно. Такую формулу я вывел сам, посмотрев на соотношения должных результатов, скорее всего, это какая-то неправильная формула) Ну у Виленкина под именно этот случай (когда K может быть меньше N) я не нашёл рецепта.