Bỏ qua đến nội dung

Hướng giải: GCD

GCD

Mã bài: prefix10 Nhóm: Uncategorized Điểm: 100 điểm
Giới hạn
1,0 s, 256 MB
Tỉ lệ AC
3,4%
Người giải
1
Chỉ đọc hướng giải khi bế tắc và đừng sao chép mã trong đó. Hãy tôn trọng người ra đề và người viết hướng giải: nộp lời giải chính thức khi chưa tự giải được bài có thể khiến bạn bị khóa tài khoản.

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 M_i khi thay đổi A_i, với mọi i, sau đó in ra giá trị lớn nhất trong các M_i.

Trước hết, nếu quyết định thay đổi A_i, ta có thể thay nó bằng \text{GCD} của N - 1 số còn lại. Khi đó, phép toán "thay đổi số nguyên A_i" tương đương với việc "xóa số nguyên A_i".

Ngoài ra, ký hiệu \text{GCD} của hai số nguyên X và Y là gcd(X, Y). Phép toán \text{GCD} có tính kết hợp, tức là với mọi số nguyên X, Y, Z: gcd(gcd(X,Y),Z)=gcd(X,gcd(Y,Z)). Nói đơn giản, \text{GCD} 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 i = 1, 2, ..., N + 1, định nghĩa L(i) và R(i) 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 L(0)=R(N+1)=0 và với mọi số nguyên X: gcd(0,X)=gcd(X,0)=X. Khi quyết định thay đổi A_i (tức là xóa A_i), \text{GCD} của N-1 số còn lại là: \(M_i​=gcd(L(i-1),R(i+1))\). Việc tính toán các L(i) và R(i) 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))\)​

Bình luận