Nhận xét: Với mỗi số x bất kì, ta có tối đa log2(x) lần thay đổi giá trị GCD
Vậy, với mỗi vị trí i, ta có thể tìm xem lần thay đổi GCD tiếp theo nằm ở đâu, và nhảy nhanh đến đấy.
Để xử lí việc này, ta có thể kết hợp cấu trúc dữ liệu Sparse Table và thuật toán tìm kiếm nhị phân. Với mỗi lần tìm kiếm này, ta mất O(log(n)), do ta có thể dùng Sparse Table để tìm kiếm GCD của khoảng trong O(1), và tìm vị trí khiến cho GCD thay đổi trong log(n)
Tổng độ phức tạp: O(n∗log(n)∗log(max(a)))≈5∗107
Code tham khảo:
cpp#∈cludebits/stdc++.husingnamespacestd;∫ma∈(){c∈.tie(0)→syncwithstdio(0);∫n;c∈〉n;→→r<∫>a(n);for(∫i=0;i<n;i++){c∈〉a[i];}const∫max