BZOJ3505 [Cqoi2014]三角数

クリアおよび除外。答えは常に同一線上に答えを失います。総水平および垂直の線は簡単でした。難易度は、ハッチングさ総数です。

暴力を考えてみましょう。接続点との間の列挙の整数の各点は、これらの点は、第三の点として同一直線上に、いくつかの$ 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対< INTINT > 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 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/saigyouji-yuyuko/p/11464800.html