Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Lazarus, Free Pascal, CodeTyphon
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2012, 22:26   #1
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию Неподвижные точки можно выбрать N!/((n-k)!*k!) способами. найти субфакториал оставшихся элементов.

Вот задача
статья про субфакториал
В общем, я решал так.
Неподвижные точки можно выбрать N!/((n-k)!*k!) способами.
Затем задача сводиться к тому, чтобы найти субфакториал оставшихся элементов.
Код:
program project1;


function Factorial(n:word):longword;
var i:word;
begin
   result:=1;
   for i:=2 to n do result:=result*i;
end;

function subFact(n:word):longword;//Считает ИМХО верно
var j:word;
  Z,k,sum:longword;
begin
  Z:=factorial(n);

  k:=1;
  sum:=0;
  for j:=2 to n do
      begin
           k:=k*j;
           if odd(j) then
             dec(sum,Z div k) else inc(sum, Z div k);//Вычисляется сумма числителей, факториал сокращается
      end;
  result:=sum;
end;

var n,k:word;
  f:textfile;
begin
    assignfile(f,'input.txt');
    reset(f);
    read(f,n,k);
    closefile(f);
    assignFile(f,'output.txt');
    rewrite(f);
    write(f,factorial(n)*subfact(n-k) div factorial(n-k)div factorial(k));
    closefile(f);
end.
Программа почему то неправильно работает при n =9;k = 0

по идее 9!*!(9-0)/( (9-0)! * 0!) = 9!*!9/9!=!9=133496
но выводит 3302.
Помогите решить задачу, пожалуйста. Неделю уже бьюсь.
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 29.12.2012, 22:35   #2
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Тут немного изменил код. все byte заменил на word и все longword на int64.
Выводит правильный ответ. но на этом сайте все равно пишет, что неверно :-(
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 29.12.2012, 23:50   #3
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Скормить программе n=30, k=30 и она сдохнет. 30! не влезет никуда.
Abstraction вне форума Ответить с цитированием
Старый 30.12.2012, 01:07   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Прошла все тесты:
Код:
function c(m, n: byte): longint;
begin
  if (m = 0) or (n = m) then
    c := 1
  else
    c := c(m, n - 1) + c(m - 1, n - 1);
end;

function Factorial(n: byte): longint;
var
  i: byte;
  s: longint;
begin
  s := 1;
  for i := 2 to n do
    s := s * i;
  Factorial := s;
end;

function subFact(n: byte): longint;
var
  j: byte;
  Z, k, sum: longint;
begin
  Z := Factorial(n);
  k := 1;
  sum := 0;
  for j := 2 to n do
  begin
    k := k * j;
    if odd(j) then
      dec(sum, Z div k)
    else
      inc(sum, Z div k);
  end;
  subFact := sum;
end;

var
  n, k: byte;

begin
  assign(input, 'input.txt');
  reset(input);
  assign(output, 'output.txt');
  rewrite(output);
  read(n, k);
  if n = k then
    write(1)
  else
    write(c(k, n) * subFact(n - k));
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
разобраться в программе до конца(две программы:Вывести тысячное простое число; Сколькими способами можно разменять сумму) (С/С++) -MOLODOY- Помощь студентам 0 28.12.2013 12:36
Комбинаторика: Сколькими способами из колоды карт в 36 листов можно выбрать неупорядоченный набор из 5 карт так, чтобы .... sergey163 Помощь студентам 2 28.11.2013 23:27
Какими способами в String можно узнать является ли первый символ пробелом? Des Помощь студентам 10 07.11.2010 11:19
Какими способами можно реализовать кэширование для прокси - сервера? Slavka8800 Работа с сетью в Delphi 0 02.06.2009 22:08
сколькими способами можно разрезать прямоугольник на n-ное количество частей? 4ingiz Общие вопросы Delphi 2 31.01.2008 06:40