note: Lần sau thêm Thảo luận:
vào đầu topic nếu bạn muốn mọi người vào thảo luận nhé 
Mà bộ nhớ sao là 512MiB được nhỉ? 512MB chứ?
Mình hơi nghiêng về phía brute force + 1 tí tổ hợp.
Để cho nhanh, ta không xét số 0 đứng độc lập mà ta tạo thành khối các số 0 liên tiếp, các số 1 liên tiếp cũng thành 1 khối, kiểu như số 1100101
khi chia thành các khối sẽ là 11
, 00
, 1
, 0
, 1
. Như vậy, coi như sau một khối các số 0 sẽ chỉ là khối các số 1.
Đến đây, ta nhận thấy rằng: sau mỗi 1 khối các số 0 sẽ chỉ có 1 khả năng là đặt tiếp khối các số 1 vào ngay sau đó.
Ta định nghĩa F(pos, prev, len_prev, cnt, ok)
với pos
là số phần tử của xâu đã xây dựng xong trước đó, prev
là giá trị của khối ta vừa đặt cuối cùng (prev = 0 hoặc 1
), len_prev
là độ dài của khối ta vừa đặt cuối cùng (nếu prev = 0
thì ta chú ý len_prev < i
), cnt
là số xâu nhị phân hoàn chỉnh ta đã xây dựng được, và ok
là bool (nếu ta dựng được xong 1 dãy, khi đó pos = n
(ta đã xây xong cả dãy), cnt = k
và ok=true
thì ra return cái dãy này (nhớ có 1 mảng truy vết)
Sẽ có 1 chút mẹo để giảm tiếp thời gian chạy. Tạm thời mình mới nghĩ đến đây @@ Chắc như trên cũng ăn được khối test đấy, mong là được 1/3 :v
*p/s: klq nhưng thớt cho mình xin link submit bài này với :v bài này trông quen quen nhưng mà mình chưa nhớ ra đã nhìn thấy ở đâu :v