Official

O - Triangle Editorial by a1048576


まず、題意を満たす3点の選び方を考えるのではなく、3点が一直線上に並ぶような選び方を全体から引くことを考えます。

\(X\)\(Y\) が等しい場合は予め取り除き、 \(X_1 < X_2 < X_3\)\(Y_1 < Y_2 < Y_3\) と仮定します。( \(Y_1 > Y_2 > Y_3\) の場合も対称性より同様)

ここで、 \(X_3 - X_1\)\(gcd(X_3 - X_2, X_2 - X_1)\) を固定して考えると、

\(X_1\) の候補は \(H - (X_3 - X_1)\) 通り

\(X_3 - X_2 : X_2 - X_1 = Y_3 - Y_2 : Y_2 - Y_1\) より、 \(Y_3 - Y_1\)\((X_3 - X_1) / gcd(X_3 - X_2, X_2 - X_1)\) の倍数

\(Y_3 - Y_1\) の候補それぞれに対し、それに対応する \(Y_1\) の候補は \(W - (Y_3 - Y_1)\) 通り

\(X_2\) の候補は、上記の固定した値を満たすものの個数

\(Y_2\) の値は、\(X_3 - X_2 : X_2 - X_1 = Y_3 - Y_2 : Y_2 - Y_1\) より上の4つを定めた時点で一意に定まる

となるので、②③は等差数列の和となり \(O(1)\) で、④は約数包除により \(X_3 - X_1\) の値ごとに \(O(d(x)^2)\) で求めることができます。( \(d(x)\)\(x\) の約数の個数を表す)以上より、\(N = min(H,W)\) として全体で \(O(NlogNd(x))\) で求めることができます。 \(d(x)\) はこの制約上で最大128になり、およそ\(2.2×10^8\)の計算が必要になるように見えますが、実際はこれよりも遥かに高速に動作します。

posted:
last update: