canuc80k2220·21/50

Đoạn Cùng Phần Dư

Nộp bài trên LQDOJ

Bài 2.3 · Sparse Table

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 sao cho mọi phần tử trong đoạn đều có cùng phần dư khi chia cho .

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 , số bộ dữ liệu.
  • Mỗi bộ dữ liệu gồm:
  • Một dòng chứa số nguyên .
  • Một dòng chứa số nguyên , đô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

  • .
  • .
  • .
  • Các phần tử trong cùng một bộ dữ liệu đôi một khác nhau.
  • Tổng qua mọi bộ dữ liệu không vượt quá .

Scoring

  • Subtask ( số điểm): và tổng không vượt quá .
  • Subtask ( 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 có mọi phần tử cùng dư khi chia cho , nên đạt độ dài . Ở bộ cuối, đoạn cùng dư modulo .

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ớ.