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