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