canuc80k0228·29/50

Đếm Đoạn Có Tổng Chia Hết

Nộp bài trên LQDOJ

Bài 02 · Prefix Sum

Cho dãy gồm số nguyên. Một đoạn con là một dãy phần tử liên tiếp, không rỗng, được xác định bởi hai chỉ số và ().

Hãy đếm số đoạn con có tổng

chia hết cho .

Input

  • Dòng đầu chứa số nguyên .
  • Dòng thứ hai chứa số nguyên .

Output

  • In một số nguyên - số đoạn con thỏa điều kiện.

Constraints

  • .
  • .
  • Đáp án có thể vượt giới hạn số nguyên bit.

Scoring

  • Subtask ( số điểm): .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

6
2 -3 4 1 -4 6

Output

3

Giải thích: Ba đoạn có tổng chia hết cho là có tổng có tổng và có tổng . Không có đoạn nào khác thỏa điều kiện.

Lời giải tóm tắt
  • Ý tưởng: Gọi P[i] là tổng A_1..A_i, với P[0]=0. Tổng đoạn [l,r] chia hết cho N khi
  • Ý tưởng: P[r] ≡ P[l-1] (mod N).
  • Ý tưởng: Duyệt các prefix từ trái sang phải. cnt[x] lưu số prefix trước đó có phần dư x. Prefix hiện tại tạo một đoạn hợp lệ với từng prefix trước cùng phần dư, nên cộng cnt[rem] vào đáp án rồi tăng bộ đếm. Khởi tạo cnt[0]=1 cho prefix rỗng và chuẩn hóa phần dư âm về 0..N-1.
  • Chứng minh tính đúng: Phép biến đổi đồng dư tạo song ánh giữa mỗi đoạn hợp lệ kết thúc tại r và một prefix trước r có cùng phần dư với P[r]. Tại thời điểm xử lý r, cnt[rem] đếm đúng các prefix đó, nên số được cộng là chính xác. Mỗi đoạn có một đầu phải duy nhất, vì vậy tổng qua mọi r đếm mỗi đoạn đúng một lần và không đếm đoạn rỗng.
  • Độ phức tạp: Thời gian O(N), bộ nhớ O(N); đáp án dùng long long.