Dãy con dài nhất có tổng chia hết cho K

Xem dạng PDF

Gửi bài giải


Điểm: 0,09 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 512M
Input: stdin
Output: stdout

Nguồn bài:
Lê Minh Hoàng
Dạng bài
Ngôn ngữ cho phép
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch

Cho một dãy gồm ~n~ ~(n \le 1000)~ số nguyên dương ~A_{1}~, ~A_{2}~, ..., ~A_{n}~ và số nguyên dương ~k~ ~(k \le 50)~. Hãy tìm dãy con gồm nhiều phần tử nhất của dãy đã cho sao cho tổng các phần tử của dãy con này chia hết cho ~k~.

Input

  • Dòng đầu tiên chứa hai số ~n~, ~k~ ghi cách nhau bởi ít nhất ~1~ dấu trống.
  • Các dòng tiếp theo chứa các số ~A_{1}~, ~A_{2}~, ..., ~A_{n}~ được ghi theo đúng thứ tự cách nhau ít nhất một dấu trống hoặc xuống dòng

Output

Gồm ~1~ dòng duy nhất ghi số lượng phần tử của dãy con dài nhất thoả mãn

Sample Input

10 3
2 3 5 7
9 6 12 7
11 15

Sample Output

9

Bình luận

Hãy đọc nội quy trước khi bình luận.



  • 5
    ChiPhatNguyen  đã bình luận lúc 14, Tháng 8, 2025, 6:18 sửa 2

    Ý tưởng giải bài toán tìm dãy con dài nhất có tổng chia hết cho k (theo đoạn code đã cho):

    1. Nhận xét:
      • Ta chỉ cần quan tâm tới tổng chia dư cho k (mod k), không cần tổng thực tế
      • Khi duyệt từng phần tử, chỉ cần biết trạng thái "độ dài dãy con dài nhất" ứng với từng giá trị dư
    2. Định nghĩa trạng thái:
      • F[i][j]: Độ dài dãy con dài nhất xét trong i phần tử đầu tiên mà tổng chia k dư j
    3. Khởi tạo:

      • Với 1 phần tử duy nhất a[1] (sau khi lấy mod k), ta có F[1][a[1]] = 1
      • Các F[1][i] khác (i khác a[1]) = -inf
      • Đặc biệt, F[1][0] = 0 nếu không chọn phần tử nào
    4. Công thức chuyển: Khi xét phần tử a[i], với mỗi dư j:

      • Không chọn a[i]: F[i][j] = F[i-1][j]
      • Chọn a[i]: F[i][j] = F[i-1][(j - a[i] + k) % k] + 1
      • Lấy giá trị lớn nhất của hai trường hợp
    5. Kết quả:

      • Sau khi duyệt hết n phần tử, F[n][0] chính là độ dài dãy con dài nhất có tổng chia hết cho k

    code ví dụ : code


  • -7
    phannam310810  đã bình luận lúc 4, Tháng 6, 2025, 6:10

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • -1
    donhatnamqn2024  đã bình luận lúc 19, Tháng 5, 2025, 0:20

    hello


  • -1
    nongquan  đã bình luận lúc 5, Tháng 3, 2025, 4:48

    https://vnspoj.github.io/problems/QBSEQ.html


  • -1
    ghuy4g  đã bình luận lúc 26, Tháng 1, 2024, 6:17

    này là dãy con tăng th hay dãy con tăng liên tiếp ạ


    • 2
      clone_testcode  đã bình luận lúc 26, Tháng 1, 2024, 18:48

      không liên tiếp cũng được nhé


  • -3
    thienban  đã bình luận lúc 19, Tháng 11, 2021, 9:33

    Mọi người ơi, tên tệp vào tệp ra là gì nhỉ


    • 3
      jalsol  đã bình luận lúc 20, Tháng 11, 2021, 3:54

      khi làm bài (trên cả VNOJ lẫn các trang khác), nếu không có yêu cầu cụ thể thì thường là đầu vào, đầu ra chuẩn chứ không qua file nhé


  • -2
    tinymus46  đã bình luận lúc 19, Tháng 10, 2021, 8:09

    Cho em hỏi vì sao bài này dùng mảng tổng dồn xong for lồng lại bị wa nhỉ


    • 8
      mgl_diamond  đã bình luận lúc 19, Tháng 10, 2021, 11:25

      mảng tổng dồn? cái này không phải dãy con liên tiếp đâu nhé


      • -11
        tinymus46  đã bình luận lúc 19, Tháng 10, 2021, 12:12

        Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


    • 6
      darkkcyan  đã bình luận lúc 19, Tháng 10, 2021, 8:28

      Bạn chịu khó debug code cẩn thận nhé. Code của bạn chỉ phải đổi duy nhất 1 kí tự là ổn rồi ;)


      • -3
        tinymus46  đã bình luận lúc 19, Tháng 10, 2021, 10:07

        A khai sáng cho e với, debug tới chết mất, e k hiểu đoạn nào sai cả ;((


        • 7
          darkkcyan  đã bình luận lúc 19, Tháng 10, 2021, 10:12

          Thử test này

          3 3
          1 1 1
          

          • -28
            tinymus46  đã bình luận lúc 19, Tháng 10, 2021, 13:38

            Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


          • -4
            tinymus46  đã bình luận lúc 19, Tháng 10, 2021, 12:13 sửa 2

            ra 3 anh ạ