Определить, какое минимальное и какое максимальное количество пар друзей могло образоваться после соревнования - 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 выводятся на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д