Editorial for GCD
Submitting an official solution before solving the problem yourself is a bannable offence.
Author:
Nguồn: AtCoder
Về hướng giải, ta sẽ nhanh chóng tính giá trị lớn nhất của ước chung lớn nhất khi thay đổi
, với mọi
, sau đó in ra giá trị lớn nhất trong các
.
Trước hết, nếu quyết định thay đổi , ta có thể thay nó bằng
của
số còn lại. Khi đó, phép toán "thay đổi số nguyên
" tương đương với việc "xóa số nguyên
".
Ngoài ra, ký hiệu của hai số nguyên
và
là
. Phép toán
có tính kết hợp, tức là với mọi số nguyên
:
. Nói đơn giản,
có tính chất "tính từ vị trí nào trước cũng cho cùng một kết quả". Khi đó, ta có thể sử dụng kỹ thuật sau: Với
, định nghĩa
và
như sau:
\[L(i)=gcd(A_1,A_2,...,A_i)\] \[R(i)=gcd(A_i,A_{i+1},...,A_N)\]
Để thuận tiện, ta quy ước và với mọi số nguyên
:
. Khi quyết định thay đổi
(tức là xóa
),
của
số còn lại là: \(M_i=gcd(L(i-1),R(i+1))\). Việc tính toán các
và
có tư tưởng tương tự như Tổng tiền tố (Prefix Sum).
Như vậy, sau khi tính được \(M_1,M_2,...,M_N\) thì đáp án chính là \(\max(M_1,M_2,...,M_N)\).
Độ phức tạp: \(O(N.log(A_1)+ N.log(A_N))\)
Comments