Free Contest 26 - 010101
Xem dạng PDF
Gửi bài giải
Điểm:
0,50 (OI)
Giới hạn thời gian:
1.0s
Giới hạn bộ nhớ:
256M
Dạng bài
Ngôn ngữ cho phép
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch
Trong trường hợp đề bài hiển thị không chính xác, bạn có thể tải đề bài tại đây: Đề bài
Lưu ý: các bạn không nhập, xuất dữ liệu bằng file kể cả khi đề bài có yêu cầu. Đọc, ghi dữ liệu được thực hiện ở stdin và stdout.
Bình luận
Nhận xét ban đầu
Nlẻ → không thể có số lượng0 = 1→ đáp án = 0K = 0→ không tồn tại số chia hết cho 0 → đáp án = 0Từ đây, giả sử:
Ý tưởng chính
Ta xây dựng xâu nhị phân từ trái sang phải. Khi thêm một bit
b ∈ {0,1}vào cuối một số nhị phân hiện tại có giá trịmod:Do cần kiểm soát số lượng bit 1, ta dùng DP theo vị trí + số bit 1 + modulo.
Định nghĩa DP
Gọi:
Trong đó:
pos: đã đặtposbit (0 → N)one: số bit1đã dùngmod: giá trị hiện tại moduloKSuy ra:
Điều kiện hợp lệ
one ≤ N/2zero ≤ N/2pos = 0→ không được đặt bit 0 (tránh số có 0 ở đầu)Chuyển trạng thái
Tại
dp[pos][one][mod]:Đặt bit
1Nếu
one + 1 ≤ N/2:Đặt bit
0Nếu
pos > 0vàzero + 1 ≤ N/2:Trạng thái khởi đầu & kết thúc
Khởi đầu:
Kết quả cần tìm:
Tính đúng đắn
None ≤ N/2,zero ≤ N/2đảm bảo đúng số lượng bitmod = 0⇒ chia hết choK⇒ DP đếm đúng và đủ
Độ phức tạp
Chạy rất nhanh
Code C++ hoàn chỉnh