Hướng dẫn cho HackDream Orange 08-E: Chọn số
Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.
Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.
Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.
Mỗi số chia lấy dư cho ~m~, phần dư chỉ thuộc đoạn ~[0, m-1]~. Gọi ~prf_i~ là tổng tiền tố đến vị trí ~i~. Nếu ~n \ge m~, chắc chắn tồn tại hai vị trí khác nhau ~i, j~ mà ~0 \le j < i \le n~ mà ~prf_i \equiv prf_j (mod\space m)~ theo nguyên lí Dirichlet.
Đối với ~n < m~, ta xài quy hoạch động: ~dp(i, mo) = True/False~ là tính đến ~i~, tồn tại hay không cách chọn tập con mà tổng chia lấy dư cho ~m~ bằng ~mo~. Chú ý cách lấy kết quả để tránh trường hợp tập rỗng.
Độ phức tạp thuật toán: ~O(n \times m)~.
Bình luận