Liệt kê theo thứ tự tăng dần tất cả các số nguyên dương có biểu diễn thập phân chứa chuỗi con liên tiếp 666.
Với mỗi số thứ tự k, hãy in phần tử thứ k của dãy này. Một số chỉ xuất hiện một lần trong dãy, kể cả khi nó chứa nhiều lần chuỗi 666.
Input
Dòng đầu chứa số nguyên T.
Mỗi trong T dòng tiếp theo chứa một số nguyên k.
Output
Với mỗi truy vấn, in số thứ k chứa 666.
Constraints
1≤T≤100.
1≤k≤10,000,000.
Đáp án nằm trong miền số nguyên không dấu 64 bit.
Scoring
Subtask 1 (50 điểm):T≤10 và k≤1,000.
Subtask 2 (50 điểm): Không có giới hạn bổ sung.
Example
Test 1
Input
3
1
2
3
Output
666
1666
2666
Giải thích: Theo thứ tự tăng dần, ba số đầu tiên chứa chuỗi 666 là 666,1666 và 2666.
Lời giải tóm tắt
Ý tưởng: Digit DP đếm bao nhiêu số không vượt một cận đã từng chứa 666, với trạng thái độ dài đoạn 6 liên tiếp chặn ở 2 và cờ đã thấy mẫu. Binary search cận nhỏ nhất có số lượng ít nhất k.
Tính đúng đắn: Ta chứng minh theo thứ tự các vị trí được duyệt. Ở mỗi trạng thái, các thành phần của trạng thái lưu đúng toàn bộ thông tin về tiền tố đã chọn có thể ảnh hưởng đến phần còn lại. Mỗi chữ số hoặc bit hợp lệ tiếp theo được xét đúng một lần, đồng thời điều kiện giới hạn bảo đảm tiền tố không vượt cận đang đếm. Vì thế mọi giá trị hợp lệ xuất hiện đúng một đường đi và mọi đường đi được cộng đều tương ứng với một giá trị hợp lệ. Khi dùng hiệu hai hàm tiền tố, mỗi phần tử trong đoạn đóng được tính đúng một lần.
Độ phức tạp: O(log(answer)·L·3·2·10) thời gian và O(L·3·2) bộ nhớ cho mỗi truy vấn.
Ý tưởng: Tăng lần lượt các số dương, kiểm tra chuỗi 666 và dừng khi gặp phần tử thứ k.
Điểm dễ sai: giữ cờ đã tìm thấy mẫu
Điểm dễ sai: xử lý chuỗi 666 chồng lấn
Điểm dễ sai: tìm số nhỏ nhất có số lượng tiền tố ít nhất k