クリアおよび除外。答えは常に同一線上に答えを失います。総水平および垂直の線は簡単でした。難易度は、ハッチングさ総数です。
暴力を考えてみましょう。接続点との間の列挙の整数の各点は、これらの点は、第三の点として同一直線上に、いくつかの$ GCD(X_1、X_2、Y_1-Y_2)-1 $であることができます。
これは、(同一線上の端部としてのみ列挙し、各点の列挙)が漏れていないことが判明し得ます。
高い複雑。最適化を考えてみましょう。
ディスカバリエンドポイントは、中間点の数が$ GCD(I、J)-1 $を計算する、唯一の他の端を列挙するために$(0,0)$を、固定されていてもよいです。
そして次に$(0,0)ポイントが$ $ X \当量を満たすように変換することができることを見出しN-I + 1、Y用の\当量のM-J +任意の$(x、y)は1 $ $、種の数は同じです計算結果。
これは、エンドポイントの列挙を簡素化します。
そして、我々は共同スラッシュの種類を扱います。2(傾斜が0未満である)は、対称な結果を与えることに留意されたいです。
1の#include <iostreamの> 2の#include <cstdioを> 3の#include <CStringの> 4の#include <アルゴリズム> 5の#include <cmath> 6 の#define DBG(X)CERR << #X << "=" << X <<てendl 7 使って 名前空間はstdを、 8 typedefの長い 長いLL。 9 typedefの符号なしの長い 長いULL。 10 typedefをダブルデシベル。 11のtypedef対< INT、INT > PII。 12テンプレート<型名T>返す A <Bを?:B;} 13テンプレート<型名T>インラインT _max(TA、TB){ 戻り A> B?:B;} 14テンプレート<型名T>インラインチャー MIN(T&A、TB){ 戻り A> B(A = B、?1):0 ;} 15テンプレート<型名T>インラインチャー MAX(T&A、TB) { 戻り <Bを(A = B、?1):0 ;} 16テンプレート<型名T>インラインボイド _swap(T&A、T&B){A ^ = B ^ = A ^ = B;} 17テンプレート<型名T>インラインTリード(T&int型の F = 0 ; char型の C; しばらく(isdigit(C = getchar関数())!)の場合(C == ' - ')は、f = 1 ; 19 一方(isdigit(c)参照)、X = X * 10 +(C&15)、C = GETCHAR()。返す fはX = - ?X:X; 20 } 21 ULLのN、M、S、ANS。 22インラインint型 GCD(INT A、INT B){ 戻り Bの== 0 A:GCD(B、%のB);} 23 24 INTメイン(){ //freopenは( "test.in"、 "R"、STDIN)。// freopenは( "test.outに"、 "W"、STDOUT)。 25 リード(N)、(m)を読み出す; ++ N、M ++; S = N * M。 26 ANS = Sで*(S- 1)*(S- 2)/ 6 -nの* M×(M- 1)*(M- 2)/ 6 -mの* N *(N- 1)*(N- 2)/ 6 。 27 のために(登録をint = I 1を、iがn <; ++ I) 28 のため(登録INT J = 1 ; J <M; ++ j)は 29 ANS - =(GCD(I、J) - 1)* 1ull×(MJ)*(NI)* 2 。 30 のprintf(" %のLLU " 、ANS)。 31 リターン 0 ; 32 }