Определить, какое минимальное и какое максимальное количество пар друзей могло образоваться после соревнования - Free Pascal
Формулировка задачи:
Помогите решить эту задачу:
Для участия в соревнованиях n участников были разбиты некоторым образом на m команд так, чтобы в каждой команде был хотя бы один участник. После соревнований каждая пара участников из одной команды стала друзьями.
Ваша задача — написать программу, которая определит, какое минимальное и какое максимальное количество пар друзей могло образоваться после соревнования.
Входные данные
В единственная строке содержатся два целых числа n и m, разделенных одним пробелом (1 ≤ m ≤ n ≤ 109) — количество участников и количество команд соответственно.Выходные данные
Требуется вывести два целых числа kmin и kmax — минимальное возможное количество пар друзей и максимальное возможное количество пар друзей соответственно.Примеры тестов
входные данные
5 1выходные данные
10 10входные данные
3 2выходные данные
1 1входные данные
6 3выходные данные
3 6Примечание
В первом примере все участники попадают в одну команду, поэтому в любом случае будет образовано ровно десять пар друзей. Во втором примере при любом разбиении в одной из команд будет два участника, а в другой — один. В таком случае количество пар друзей всегда будет равно одному. В третьем примере минимальное количество друзей выходит при разбиении на команды по 2 человека, а максимальное — при разбиении на команды размерами 1, 1 и 4 человек.Решение задачи: «Определить, какое минимальное и какое максимальное количество пар друзей могло образоваться после соревнования»
textual
Листинг программы
- function Proc(aa,ak:integer):integer;
- begin
- if ak=1
- then Proc:=aa
- else
- begin
- While ak<>1 do
- begin
- Dec(ak);
- aa:=aa+ak;
- end;
- Proc:=aa;
- end;
- end;
- var s:string;
- i,j,a,n,m,t,k,k1,kmin,kmax:integer;
- begin
- Writeln('Vvodnaya stroka:');
- Readln(s);
- Writeln;
- i:=1; k:=0;
- While i<=Length(s) do
- begin
- if s[i]<>' '
- then k:=10*k+(Ord(s[i])-Ord('0'))
- else
- begin
- n:=k;
- k:=0;
- end;
- if i=Length(s)
- then
- begin
- m:=k;
- Break;
- end;
- Inc(i);
- end;
- k1:=m-1;
- i:=n-k1;
- if i=1
- then kmax:=0
- else
- begin
- k:=i-1;
- a:=k;
- kmax:=Proc(a,k);
- end;
- kmin:=0;
- k:=n div m;
- k1:=n mod m;
- if k1<>0
- then
- begin
- for j:=1 to k1 do
- begin
- a:=k;
- kmin:=kmin+Proc(a,k);
- end;
- if k<>1 then
- for j:=1 to (m-k1) do
- begin
- t:=k-1;
- a:=t;
- kmin:=kmin+Proc(a,t);
- end;
- end
- else
- if k<>1
- then
- begin
- t:=k-1;
- a:=t;
- kmin:=Proc(a,t)*m;
- end;
- Writeln(kmin,' ',kmax);
- Readln;
- end.
Объяснение кода листинга программы
- Функция Proc принимает два параметра: aa и ak.
- Если ak=1, то Proc присваивается значение aa.
- Иначе, в цикле while ak не равно 1, происходит уменьшение ak на единицу и суммирование ak с aa.
- После выхода из цикла, Proc присваивается значение aa.
- В основной программе, после ввода строки, происходит подсчет количества цифр, введенных пользователем.
- Затем, используя найденное количество цифр, происходит вычисление максимального и минимального количества пар друзей.
- Для этого используется рекурсивный вызов функции Proc.
- Код использует две переменные kmin и kmax для отслеживания минимального и максимального количества пар друзей.
- Если kmin равно 0 и kmax не равно 0, то это означает, что все цифры были использованы и не осталось пар друзей.
- В этом случае, значение kmax присваивается переменной kmin.
- Значение kmax вычисляется как произведение количества цифр на количество оставшихся друзей.
- Значение kmin вычисляется как произведение количества цифр на количество оставшихся друзей, умноженное на количество оставшихся друзей.
- Значения kmin и kmax выводятся на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д