BZOJ3505 [Cqoi2014] треугольные числа

Ясно включение и исключение. Ответ всегда проигрывает коллинеацию ответа. Всего горизонтальные и вертикальные линии были простыми. Трудность заключается в заштрихованном общем количестве.

Рассмотрим насилие. Каждая точка целого числа перечисления между соединительными точками, эти точки могут быть коллинеарными в качестве третьей точки, несколько $ НОД (x_1-x_2, y_1-y_2) -1 $.

Это может оказаться не утечка (только перечислены и перечисление каждой точки в качестве концов коллинеарных).

Высокая сложность. Рассмотрим оптимизацию.

Открытие конечная точка может быть зафиксирована $ (0,0) $, чтобы перечислить только другой конец, то количество промежуточной точки вычислительном $ НОД (I, J) -1 $.

И затем обнаружил, что $ (0,0) точка может быть переведены, чтобы удовлетворить $ $ х \ Leq п-г + 1, у \ Leq м-J + произвольные $ (х, у) 1 $ в $, число видов являются одинаковым результаты расчетов.

Это упрощает перечисление конечной точки.

И тогда мы имеем дело с видами сотрудничества слэш. Обратите внимание, что на 2, чтобы дать симметричные результаты (наклон меньше 0).

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 }
Просмотр кода

 

рекомендация

отwww.cnblogs.com/saigyouji-yuyuko/p/11464800.html