You are on page 1of 3

GCD

Cho dãy . Bỏ 1 phần tử trong dãy sao cho GCD của dãy còn lại đạt lớn nhất.
Cách 1: vét
for (i = 1; i <= n; ++i)
𝑎𝑖
{
g = 0;
for (j = 1; j <= n; ++j)
if (j != i) g = __gcd(g, a[j]);
ans = max(ans, g);
}
Phân tích tại sao không hiệu quả
- Giả sử bỏ phần tử thứ , dãy tách thành 2 phần và
- Khi dịch từ trái sang phải, các phần tử trong 2 phần được xét lại nhiều lần
Nhận xét:
- Ta có tính chất sau: GCD(a, b, c) = GCD(a, GCD(b, c) = GCD(GCD(a, b), c)
- Hệ quả: GCD(a, b, c, d) = GCD(GCD(a, b), GCD(c, d))
- Gọi , gọi .
- Ta có đoạn chương trình cải tiến

l[0] = r[n+1] = 0; 1 𝑖 𝑛
for (i = 1; i <= n; ++i)
{
g = __gcd(l[i-1], r[i+1]);
ans = max(ans, g);
}
Nhận xét:
l[i] = GCD(a[1], a[2], …, a[i])
r[i] = GCD(a[n], a[n-1], …, a[i])
- Dựa vào tính chất sau: GCD(a, b, c) = GCD(GCD(a, b), c), ta có
l[i] = GCD(a[1], a[2], …, a[i-1], a[i]) = GCD(l[i-1], a[i])
r[i] = GCD(a[n], a[n-1], …, a[i+1], a[i]) = GCD(r[i+1], a[i])

You might also like