canuc80k4305·6/10

Chia Nhóm Cân Bằng

Nộp bài trên LQDOJ

Bài 43 · Open and Close Interval Trick

Có học sinh phân biệt; học sinh có giá trị . Hãy chia toàn bộ học sinh thành các nhóm không rỗng, trong đó nhóm một người cũng được phép.

Độ mất cân bằng của một nhóm là hiệu giữa giá trị lớn nhất và nhỏ nhất trong nhóm. Tổng mất cân bằng là tổng đại lượng này trên mọi nhóm. Hai cách chia khác nhau khi quan hệ “cùng nhóm” của ít nhất một cặp học sinh khác nhau. Hãy đếm các cách chia có tổng mất cân bằng không vượt .

Input

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

Output

  • In số cách chia nhóm hợp lệ modulo .

Constraints

  • .
  • .
  • với mọi .

Scoring

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

Example

Test 1

Input

3 1
1 2 4

Output

2

Giải thích: Có cách tách cả ba học sinh thành nhóm riêng với tổng , và cách ghép hai học sinh có thời gian rồi để riêng với tổng . Mọi cách còn lại có tổng mất cân bằng lớn hơn .

Lời giải tóm tắt
  • Ý tưởng: Sắp xếp học sinh theo a tăng dần. Một nhóm đã có phần tử nhỏ nhất nhưng chưa khóa phần tử lớn nhất được gọi là mở. Khi đi qua khoảng cách gap, mỗi nhóm mở làm tổng mất cân bằng tăng thêm gap.
  • Ý tưởng: Dùng dp[open][cost]. Với học sinh hiện tại, sau khi cộng open*gap, có bốn khả năng: làm nhóm một người; thêm vào một nhóm và giữ mở; mở nhóm mới; hoặc thêm vào một nhóm rồi đóng. Các hệ số lần lượt gộp thành open+1, 1, và open.
  • Ý tưởng: Mỗi phân hoạch xác định duy nhất thời điểm mở/đóng của từng nhóm khi quét giá trị, kể cả khi các a bằng nhau. Sau cùng cần open=0 và cộng mọi cost≤K. Độ phức tạp O(n^2K), bộ nhớ O(nK).
  • Lỗi cần tránh: Cộng khoảng cách mới cho open+1 nhóm thay vì đúng số nhóm đang mở trước khi xử lý học sinh kế tiếp.
  • Lỗi cần tránh: Giữ đúng mọi trường hợp biên và kiểu số đã nêu trong đề.
  • Lỗi cần tránh: Chỉ lấy modulo ở những bài có yêu cầu modulo; bài 10 và bài 9 phải giữ nguyên số nguyên 64 bit.