Cho một dãy gồm các số nguyên dương đôi một khác nhau. Một đoạn liên tiếp được gọi là tương thích nếu tồn tại một số nguyên m≥2 sao cho mọi phần tử trong đoạn đều có cùng phần dư khi chia cho m.
Với mỗi bộ dữ liệu, hãy tìm độ dài lớn nhất của một đoạn tương thích.
Input
Dòng đầu chứa số nguyên t, số bộ dữ liệu.
Mỗi bộ dữ liệu gồm:
Một dòng chứa số nguyên n.
Một dòng chứa n số nguyên a1,a2,…,an, đôi một khác nhau.
Output
Với mỗi bộ dữ liệu, in một số nguyên là độ dài lớn nhất tìm được.
Constraints
1≤t≤2⋅104.
1≤n≤2⋅105.
1≤ai≤1018.
Các phần tử trong cùng một bộ dữ liệu đôi một khác nhau.
Tổng n qua mọi bộ dữ liệu không vượt quá 2⋅105.
Scoring
Subtask 1 (50% số điểm): t≤20 và tổng n không vượt quá 200.
Subtask 2 (50% số điểm): Không có giới hạn bổ sung.
Example
Test 1
Input
3
6
1 8 5 11 17 4
1
10
5
6 10 14 9 21
Output
4
1
3
Giải thích: Ở bộ đầu, đoạn 8,5,11,17 có mọi phần tử cùng dư 2 khi chia cho 3, nên đạt độ dài 4. Ở bộ cuối, đoạn 6,10,14 cùng dư 2 modulo 4.
Lời giải tóm tắt
Ý tưởng: Với một đoạn có ít nhất hai phần tử, mọi phần tử có cùng phần dư modulo m khi và chỉ khi m chia hết mọi hiệu giữa hai phần tử. Chỉ cần xét các hiệu kề
Ý tưởng:d_i = |a_{i+1}-a_i|.
Ý tưởng: Do các a_i đôi một khác nhau, mọi d_i dương. Đoạn gốc [l,r] hợp lệ khi và chỉ khi gcd(d_l,...,d_{r-1}) > 1.
Ý tưởng: Xây Sparse Table GCD trên d. Với mỗi đầu trái l, giá trị GCD không thể tăng khi kéo dài đầu phải, nên dùng binary search tìm đầu phải xa nhất còn có GCD khác 1.
Chứng minh tính đúng đắn: Nếu mọi phần tử cùng dư modulo m, hiệu của mọi cặp và đặc biệt mọi hiệu kề đều chia hết cho m; do đó GCD các hiệu kề ít nhất là m≥2. Ngược lại, nếu GCD các hiệu kề là g>1, mọi hiệu từ phần tử đầu tới phần tử khác là tổng các hiệu kề nên chia hết cho g; tất cả phần tử cùng phần dư modulo g.
Chứng minh tính đúng đắn: Với một đầu trái cố định, thêm một hiệu chỉ có thể giữ nguyên hoặc giảm GCD. Vì thế các đầu phải hợp lệ tạo thành một tiền tố và binary search trả đúng biên xa nhất. Lấy maximum qua mọi đầu trái cho đúng đáp án toàn cục.
Độ phức tạp: Mỗi bộ dữ liệu dùng O(n log n) thời gian và O(n log n) bộ nhớ.