Có N món hàng phân biệt, món thứ i có giá ai. Hãy đếm số cách chọn đúng K món sao cho tổng giá không vượt quá P. Hai cách chọn khác nhau nếu chúng khác nhau ở ít nhất một chỉ số món hàng.
Input
Dòng đầu chứa ba số nguyên N,K,P.
Dòng thứ hai chứa N số nguyên dương a1,a2,…,aN.
Output
In số tập con gồm đúng K vị trí và có tổng không vượt P.
Constraints
1≤K≤N≤40.
1≤P≤1018.
1≤ai≤1016.
Scoring
Subtask 1 (50% số điểm): N≤20.
Subtask 2 (50% số điểm): Không có giới hạn bổ sung.
Example
Test 1
Input
5 3 12
2 3 4 5 8
Output
4
Giải thích: Bốn bộ ba hợp lệ là {2,3,4},{2,3,5},{2,4,5} và {3,4,5}; mọi bộ ba chứa 8 đều vượt 12.
Lời giải tóm tắt
Phân tích: Chỉ lưu tổng là chưa đủ: trạng thái phải biết cả số món đã chọn. Sau khi chia đôi, nếu phía trái chọn c món thì phía phải bắt buộc chọn K-c món.
Thuật toán: Liệt kê tổng tập con của mỗi nửa và phân vào bucket theo số phần tử. Sắp xếp từng bucket bên phải. Với mỗi tổng trong bucket c bên trái, đếm bằng upper_bound các tổng trong bucket K-c không vượt P-x.
Chứng minh: Mọi tập con đúng K tách duy nhất thành c món bên trái và K-c món bên phải, nên xuất hiện trong đúng cặp bucket được thuật toán xét. upper_bound(P-x) đếm đúng các tổng phải làm tổng chung không vượt P, kể cả bằng biên. Do phép tách duy nhất, mọi nghiệm được đếm đúng một lần.
Độ phức tạp: Thời gian O(2^{N/2} log 2^{N/2}), bộ nhớ O(2^{N/2}).