canuc80k1004·5/40

Chọn Đúng K Món

Nộp bài trên LQDOJ

Bài 10 · Meet in the Middle

Có món hàng phân biệt, món thứ có giá . Hãy đếm số cách chọn đúng món sao cho tổng giá không vượt quá . 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 .
  • Dòng thứ hai chứa số nguyên dương .

Output

  • In số tập con gồm đúng vị trí và có tổng không vượt .

Constraints

  • .
  • .
  • .

Scoring

  • Subtask ( số điểm): .
  • Subtask ( 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à và ; mọi bộ ba chứa đều vượt .

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}).