良い質問ダック。。
共線の数の変換のために補完、 - 直接コレクションを使用し、その後、三角形の数を求めていません。
シークの方法は、水平及び垂直共共線番号の数と同一直線上に斜線の数が決定されます。
$ C_N ^ 3 $と$ C_mは^ 3 $に水平および垂直の既知の配列と組み合わされた知識。
斜め同一直線上を求めて:$、GCD(AXを挟んが$(> X、B> y)は、セグメントに接続された$(a、b)は(x、y)を$ $ポイントに明らかで、 )により-1 $全体のポイント、基本的な考え方は2つの点を列挙することであるので、第3の点)によって$ GCD(AX、-1可能$種。我々はまた、これらのセグメントは対称的であり、パンすることができます(/および\)、のみ$と$(x、y)は$ $(0,0)を列挙し、その2点のすべてを列挙する必要がないことがわかりましたその後、対称性と翻訳の出現数($ * $ 2)により計算されます。
それが見つかりましたので、いずれかのライン、翻訳アップダウン$(M - J)のみ$(Ni)の$、することができます$回、
*(M - J + 1)$ 1 + $のために移動されないことが$、 - したがって、それが現れる回数は$(I + 1、N)であります
#include <iostreamの> する#include <cstdioを> の#define LL長い長 の#define LL Rレジスタ 使用 名前空間STDを、 インラインINT G(){ R RET = 0、=解決1。登録のchar chのを。しばらく(!isdigit(CH = getchar関数()))修正= CH == ' - ' - ?1 :修正します。 DO RET = RET * 10 +(CH ^ 48)。一方、(isdigit(CH = GETCHAR()))。リターンのRET *の修正。 } int型、N Mと、 LL ANS。 インラインint型 GCD(INT A、INT B){ 戻り B GCD(B、%の?B);} (メイン符号付き){ N = G()+ 1、M = G()+ 1。ANS = 1LL * n個の*のM。 ANS = 1LL * ANS *(ans- 1)*(ans- 2)/ 6 -1ll×m個×n個の*(N- 1)*(N- 2)/ 6 -1ll×n個×m個×(M- 1)*(M- 2)/ 6 。 以下のための(R i = 1 ; iがn <; ++ I)のための(RのJ = 1 ; J <M; ++ j)はans- = 1LL *2*(GCD(I、J) - 1)*(NI)*(M- J)。 printf(" %LLDする\ n " 、ANS)。 }
2019年6月1日