Розглянемо розмір прямокутника a \times b, зображеного на сітці. Розглянемо, скількома способами можна вибрати значення . Сітка містить рядків квадратів, отже в сітці є n + 1 горизонтальна лінія. Пронумеруємо їх числами від до n + 1. Виберемо дві лінії і j~(i < j). Проведемо між ними відрізок — це і буде вертикальна сторона прямокутника . Кількість способів вибрати два числа і j~(i < j) з множини \{1, 2, ..., n + 1\} рівна C_{n+1}^2. Наприклад, для n = 2 є варіанти вибрати вертикальну сторону прямокутника:
Аналогічно, в сітці є m + 1 вертикальна лінія. Кількість способів вибрати горизонтальну сторону прямокутника рівна C_{m+1}^2.
Отже, кількість різних прямокутників на сітці рівна
Приклад
Для прямокутника 2 \times 3 є:
одиничних прямокутників;
прямокутника розміром 1 \cdot 2;
горизонтальних прямокутника 1 \cdot 3;
вертикальних прямокутника 2 \cdot 1;
прямокутника 2 \cdot 2;
прямокутник 2 \cdot 3;
Загалом отримали C_3^2 \cdot C_4^2 = 3 \cdot 6 = 18 прямокутників.
Реалізація алгоритму
Оскільки n, m \le 10^5, то кількість прямокутників може досягати C_{n+1}^2 \cdot C_{m+1}^2 \le (10^5)^2 \cdot (10^5)^2 = 10^{20}. Цей результат виходить за межі бітового цілого числа. Тому реалізуємо рішення на мові Пітон.
n, m = map(int, input().split())
a = (n + 1) * n // 2
b = (m + 1) * m // 2
res = a * b
print(res)