Мурзик одну из
цветочных клумб сделал в виде шахматной доски размерами m на n, в каждой клеточке
которой растет какой-то цветок. Иногда на эту клумбу он выводит на прогулку
Анфису (да, не удивляйтесь, они действительно друзья). Анфиса, начиная всегда с
верхнего левого угла передвигается по клумбе к правому нижнему и собирает
цветы, причем таким образом, чтобы каждый раз проходить новым маршрутом, а
Мурзик на выходе вручает ей кусочек сыра.
Посчитать, какое
наибольшее количество кусочков сыра получит Анфиса, если она все время
старается сохранить как можно больше цветов. При каждом очередном своем проходе
Анфиса обязательно должна собрать как минимум один цветок.
Вход. В одной строке заданы два числа m и n (0 < m, n
≤ 2*109).
Выход. Вывести наибольшее количество кусочков сыра, которые
может получить Анфиса.
Пример
входа |
Пример
выхода |
2 3 |
3 |
РЕШЕНИЕ
математика
Анализ алгоритма
При первом
проходе Анфиса соберет m + n – 1 цветов. На клумбе еще останется mn – (m + n – 1) = (m – 1)(n – 1) цветов. Поскольку Анфиса хочет получить максимальное
количество кусочков сыра, то каждый следующий свой проход она может
организовать так, чтобы собирать по одному цветку. То есть еще она может
совершить (m – 1)(n – 1) проходов.
Количество
полученных кусочков сыра равно 1 + (m
– 1)(n – 1).
Реализация алгоритма
Читаем входные
данные и выводим ответ.
scanf("%lld
%lld",&n,&m);
printf("%lld\n",
(n - 1) * (m - 1) + 1);
Реализация при помощи класса
#include <stdio.h>
class Long
{
private:
long long value;
public:
Long() : value(0) {}
Long(long long
value) : value(value) {}
void Read(void)
{
scanf("%lld",&value);
}
void Print(void)
{
printf("%lld\n",value);
}
Long operator+ (const
Long &x)
{
return Long(value + x.value);
}
Long operator+ (int
x)
{
return Long(value + x);
}
Long operator- (const
Long &x)
{
return Long(value - x.value);
}
Long operator- (int
x)
{
return Long(value - x);
}
Long operator* (const
Long &x)
{
return Long(value * x.value);
}
};
int main(void)
{
Long n, m, res;
n.Read();
m.Read();
res = (n - 1) * (m -
1) + 1;
//res =
n.operator -(1).operator *(m.operator -(1) ).operator +(1);
res.Print();
return 0;
}
Реализация на указателях
#include <stdio.h>
long long *n, *m;
int main(void)
{
n = new (long
long);
m = new (long
long);
scanf("%lld %lld",n,m);
printf("%lld\n", (*n - 1) *
(*m - 1) + 1);
delete n;
delete m;
return 0;
}
Java реализация
import
java.util.*;
public class Main
{
public static void main(String[] args)
{
Scanner con = new Scanner(System.in);
long n = con.nextLong();
long m = con.nextLong();
System.out.println((n - 1) * (m - 1) + 1);
}
}
Python реализация
n, m = map(int,input().split())
res = (n - 1) * (m - 1) + 1
print(res)