canuc80k2707·8/50

Các Tổng Có Thể

Nộp bài trên LQDOJ

Bài 27 · Bitset

Có đồng xu, đồng thứ có giá trị . Mỗi đồng xu được dùng nhiều nhất một lần. Hãy liệt kê mọi tổng dương khác nhau có thể tạo bởi một tập con các đồng xu.

Input

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

Output

  • Dòng đầu in số lượng tổng dương có thể tạo.
  • Dòng thứ hai in các tổng đó theo thứ tự tăng dần.

Constraints

  • .
  • .
  • Tổng mọi không vượt quá .

Scoring

  • Subtask ( số điểm): và .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

3
2 3 7

Output

7
2 3 5 7 9 10 12

Giải thích: Các tập con không rỗng tạo được các tổng và . Sau khi sắp tăng có đúng bảy tổng.

Lời giải tóm tắt
  • Mô hình và ý tưởng: Khởi tạo bit 0; với mỗi w cập nhật possible |= possible << w, rồi quét các bit dương.
  • Chứng minh tính đúng đắn: Quy nạp theo số đồng xu. Trước bước, bit s biểu diễn đúng các tổng từ các đồng đã xét; không dùng đồng mới giữ s, dùng nó tạo s+w, chính là phép dịch rồi OR. Vì vậy trạng thái cuối chứa đúng mọi tổng và quét tăng cho danh sách đúng thứ tự.
  • Độ phức tạp: O(nS/w) thời gian và O(S/w) bộ nhớ, với S là tổng giá trị đồng xu.
  • Lỗi cài đặt thường gặp: gán dp=dp<<w; duyệt tổng tăng dần thành unbounded knapsack.