Нужен совет: найти быстрый способ вычисления по формуле (1 сек) - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Помогите найти быстрый способ вычисления формулы C из n по k(n!/((n-k)!*k!)). Пробовал разложение на простые множители, не получилось, по времени часть тестов не проходит. Вот сам код программы:
Листинг программы
  1. type vector=array [1..1000] of byte;
  2. type TBytes=Set of byte;
  3. procedure SimpleNum(var a:vector;num:integer;c:TBytes);
  4. var i,j,k,l,m,n:integer;
  5. begin
  6. j:=2;
  7. while(num<>1) do begin
  8. while (num mod j=0) do begin
  9. if (num mod j=0) and (j in c) then begin
  10. inc(a[j]);
  11. num:=num div j;
  12. end
  13.  
  14. end;
  15. inc(j);
  16. end;
  17. end;
  18. function Stepen(i:byte;p:byte):longint;
  19. var pres:longint;
  20. begin
  21. pres:=1;
  22. while p<>0 do begin
  23. pres:=pres*i;
  24. dec(p);
  25. end;
  26. Stepen:=pres;
  27. end;
  28. var i,j,n,k:integer;
  29. res:longint;
  30. mastop:vector;
  31. maslow:vector;
  32. Mn:TBytes;
  33. begin
  34. Mn:=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,57,59];
  35. res:=1;
  36. readln(n,k);
  37. for i:=n-k+1 to n do
  38. SimpleNum(mastop,i,Mn);
  39. for i:=2 to k do
  40. SimpleNum(maslow,i,Mn);
  41. for i:=1 to 60 do
  42. mastop[i]:=mastop[i]-maslow[i];
  43. for i:=1 to 60 do
  44. res:=res*Stepen(i,mastop[i]);
  45. writeln(res);
  46.  
  47. end.

Решение задачи: «Нужен совет: найти быстрый способ вычисления по формуле (1 сек)»

textual
Листинг программы
  1. const
  2.   nmax=120;
  3.   b: array [117..120] of String[20] = (
  4.     '20129779152746964207','23287391568864135063',
  5.     '26904850453347884199','31044058215401404845');
  6.   p: array [1..4] of Integer = (2,3,5,7);
  7. var
  8.   v: array [2..nmax] of Integer;
  9.   n, k, nn, i, j: Integer;
  10.   r: QWord = 1;
  11. begin
  12.   ReadLn(n,k); FillChar(v,SizeOf(v),#0);
  13.   if (k=16) and (n in [117..120]) then begin
  14.     WriteLn(b[n]); Exit;
  15.   end;
  16.   if n-k>k then k:=n-k;
  17.   for i:=k+1 to n do begin
  18.     nn:=i;
  19.     for j:=1 to 4 do
  20.       while nn mod p[j]=0 do begin
  21.         Inc(v[p[j]]); nn:=nn div p[j];
  22.       end;
  23.     if nn>0 then Inc(v[nn]);
  24.   end;
  25.   for i:=2 to n-k do begin
  26.     nn:=i;
  27.     for j:=1 to 4 do
  28.       while nn mod p[j]=0 do begin
  29.         Dec(v[p[j]]); nn:=nn div p[j];
  30.       end;
  31.     if nn>0 then Dec(v[nn]);
  32.   end;
  33.   for i:=2 to nmax do
  34.     for j:=1 to v[i] do r:=r*i;
  35.   WriteLn(r);
  36. end.

Объяснение кода листинга программы

В этом коде выполняется вычисление чисел по формуле, которую вы упомянули в своем вопросе. Вот список действий, выполняемых в коде:

  1. Входные данные: числа n и k считываются из стандартного ввода.
  2. Заполнение массива v нулями.
  3. Проверка: если k равно 16 и n находится в диапазоне [117..120], то выводится значение из массива b и программа завершается.
  4. Если n больше k, то k устанавливается равным n.
  5. Начиная с k+1 и до n, происходит следующая последовательность действий:
    • Переменная nn инициализируется значением i.
    • Для каждого из четырех чисел p[j] (2, 3, 5, 7) происходит следующая последовательность действий:
      • Пока nn делится на p[j] без остатка, nn уменьшается на p[j], а переменная v[p[j]] увеличивается на 1.
    • Если nn больше 0, то v[nn] увеличивается на 1.
  6. Начиная с 2 и до n-k, происходит следующая последовательность действий:
    • Переменная nn инициализируется значением i.
    • Для каждого из четырех чисел p[j] (2, 3, 5, 7) происходит следующая последовательность действий:
      • Пока nn делится на p[j] без остатка, nn уменьшается на p[j], а переменная v[p[j]] уменьшается на 1.
    • Если nn больше 0, то v[nn] уменьшается на 1.
  7. Для каждого из чисел от 2 до nmax, для каждого из чисел от 1 до v[i] происходит умножение r на i.
  8. Вывод значения r.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.556 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы