Ясно включение и исключение. Ответ всегда проигрывает коллинеацию ответа. Всего горизонтальные и вертикальные линии были простыми. Трудность заключается в заштрихованном общем количестве.
Рассмотрим насилие. Каждая точка целого числа перечисления между соединительными точками, эти точки могут быть коллинеарными в качестве третьей точки, несколько $ НОД (x_1-x_2, y_1-y_2) -1 $.
Это может оказаться не утечка (только перечислены и перечисление каждой точки в качестве концов коллинеарных).
Высокая сложность. Рассмотрим оптимизацию.
Открытие конечная точка может быть зафиксирована $ (0,0) $, чтобы перечислить только другой конец, то количество промежуточной точки вычислительном $ НОД (I, J) -1 $.
И затем обнаружил, что $ (0,0) точка может быть переведены, чтобы удовлетворить $ $ х \ Leq п-г + 1, у \ Leq м-J + произвольные $ (х, у) 1 $ в $, число видов являются одинаковым результаты расчетов.
Это упрощает перечисление конечной точки.
И тогда мы имеем дело с видами сотрудничества слэш. Обратите внимание, что на 2, чтобы дать симметричные результаты (наклон меньше 0).
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <CString> 4 #include <алгоритм> 5 #include <CMATH> 6 #define ДБГ (х) сегг << #x << "=" << х << епсИ 7 с использованием пространства имен STD; 8 ЬурейеЕ долго долго LL; 9 ЬурейеЕ без знака длиной длиной лный; 10 ЬурейеЕ двойной дБ; 11 ЬурейиЙ пар < INT , INT > PII; 12 шаблона <Ьурепате Т>вернуться A <B? A: B;} 13 шаблон <Ьурепате Т> Т инлайн _max (ТА, ТВ) { вернуться A> B? A: B;} 14 шаблона <Ьурепате T> инлайн символ MIN (T & A, TB) { возвращение А> В (А = В,? 1 ): 0 ;} 15 шаблон <Ьурепате T> встроенный символ MAX (Т & А, ТБ) { вернуться A <B (А = В,? 1 ): 0 ;} 16 шаблон <Ьурепате Т> инлайн пустоты _swap (Т & А, Т и В) {А ^ = В ^ = А = В;} 17 шаблона <Ьурепате Т> встроенный Т чтения (Т &INT е = 0 ; символ с; в то время как (isdigit (с = GetChar (!))) , если (с == ' - ' ) е = 1 ; 19 , а (isdigit (с)) х = х * 10 + (с & 15 ), с = GetChar (); вернуться п х = - х: х; 20 } 21 лный п, т, с, ANS; 22 инлайн INT НОД ( Int а, INT б) { возвращение Ь == 0 а: НОД (Ь, а% б);} 23 24 INT основных () { //freopen ( "test.in", "г", STDIN); // freopen ( "test.out", "ш", стандартный вывод); 25 чтения (п), чтение (м); ++ , п, м ++; s = п * м; 26 ANS = s * (s - 1 ) * (s - 2 ) / 6 -n * м * (м- 1 ) * (м- 2 ) / 6 -m * п * (n - 1 ) * (п 2 ) / 6 ; 27 для (регистр INT I = 1 ; <п; ++ я) 28 для (регистр INT J = 1 , J <т; ++ , к) 29 ANS - = (НОД (I, J) - 1) * 1ull * (MJ) * (щ) * 2 ; 30 Е ( " % LLU " , ANS); 31 возврат 0 ; 32 }