6. 部分点解法-𝑂 𝑛2
log max 𝐴
• 以上より,次のようにして部分点を得ることが出来ます.
(MODを取る部分は省略)
Magic Value 6
for l in [1, n]:
int g := A[l]; // 最大公約数
int max := A[l]; // 最大値
bool has0 := false; // 見ている区間に0が含まれているか
for r in [l, n]: // 区間[l,r]について
if(A[r] == 0) has0 := true;
if(max < A[r]) max := A[r];
g := gcd(g, A[r]); // ここの計算量はO(log(max(A)))
if(has0) g := 0; // 区間に0があればgcdを0にする
ans += (max - g) * (r - l + 1);