IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Расстановки ладей
Unconnected
сообщение 15.06.2010 15:13
Сообщение #1


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Привет всем.

Я решаю довольно тривиальную задачу, хочу разобраться. Нужно найти количество способов, коими на доске 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) я не нашёл рецепта.


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 15.06.2010 15:36
Сообщение #2


Гость






Вот этот докУмент изучи, там все, что тебе нужно - написано...


Прикрепленные файлы
Прикрепленный файл  doc.pdf ( 334.85 килобайт ) Кол-во скачиваний: 168
 К началу страницы 
+ Ответить 
Unconnected
сообщение 15.06.2010 16:30
Сообщение #3


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Спасибо, занимательный докУмент. Прочитал первые несколько страниц, и понял, как решать. Вот что получилось:

{$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');
writeln(sqr(fact(n) div (fact(n-k)*fact(k)))*fact(k));
end.


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Unconnected
сообщение 15.06.2010 16:51
Сообщение #4


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Только вот что-то олимпиадная система ругается на код, на неких входных данных вылетает RE. Я установил, что это получается, когда во входных данных K>N. Но ведь тогда все ладьи расставить невозможно! В ограничениях, данных в условии, написано N,K<=8, хотя наверное должно было быть K<=N<=8.

Added: ну да, и вывести надо было 0. smile.gif

Сообщение отредактировано: Unconnected - 15.06.2010 16:58


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.06.2025 23:12
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"