canuc80k0725·26/50

Đếm Tập Con Theo Tổng

Nộp bài trên LQDOJ

Bài 07 · Backtracking

Cho dãy và số nguyên . Một tập con được chọn theo các vị trí của dãy; hai tập dùng các vị trí khác nhau được tính là hai tập khác nhau, kể cả khi các giá trị trùng nhau. Hãy đếm số tập con không rỗng có tổng bằng .

Input

  • Dòng đầu chứa và . Dòng thứ hai chứa số nguyên .

Output

  • In số tập con không rỗng có tổng đúng bằng .

Constraints

  • .
  • .
  • .

Scoring

  • Subtask (): .
  • Subtask (): Không có giới hạn bổ sung.

Example

Test 1

Input

3 0
-1 0 1

Output

3

Giải thích: Ba tập chỉ số hợp lệ là và . Tập rỗng không được tính, nên kết quả là .

Lời giải tóm tắt
  • Ý tưởng: Một tập con theo chỉ số được xác định bởi quyết định chọn hoặc bỏ từng phần tử. Cần lưu thêm cờ đã chọn ít nhất một phần tử để không tính tập rỗng khi mục tiêu bằng 0.
  • Thuật toán: DFS từ trái sang phải. Nhánh thứ nhất bỏ a[i]; nhánh thứ hai chọn nó, cộng vào tổng và đặt cờ chosen. Khi hết mảng, tăng đáp án nếu chosen đúng và tổng bằng S.
  • Tính đúng đắn: Mỗi tập chỉ số có đúng một đường chọn/bỏ nên được xét đúng một lần. Tổng được cập nhật chính xác theo các chỉ số đã chọn; cờ chosen đúng khi và chỉ khi tập không rỗng. Vì vậy điều kiện ở lá nhận đúng toàn bộ và chỉ các tập con không rỗng có tổng S.
  • Độ phức tạp: Thời gian O(2^N), bộ nhớ ngăn xếp O(N).