canuc80k4610·11/28

Giao Bằng Không

Nộp bài trên LQDOJ

Bài 46 · SOS DP

Cho một dãy số nguyên không âm. Hãy đếm số cách chọn một tập con không rỗng của các vị trí sao cho phép AND bit của toàn bộ giá trị được chọn bằng . Hai tập con khác nhau nếu chúng khác ít nhất một vị trí, kể cả khi các giá trị tại những vị trí đó bằng nhau.

Input

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

Output

  • In số tập con thỏa mãn, lấy modulo .

Constraints

  • .
  • .

Scoring

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

Example

Test 1

Input

3
1 2 3

Output

2

Giải thích: Có đúng hai tập con cho AND bằng : chọn hai vị trí mang , hoặc chọn cả ba vị trí. Các tập con còn lại có AND khác .

Lời giải tóm tắt
  • Phân tích: Một tập con có AND bằng 0 khi không tồn tại bit nào xuất hiện trong tất cả phần tử được chọn. Dùng bao hàm-loại trừ trên các bit chung. Với mask m, số vị trí chứa toàn bộ bit của m được lấy bằng superset zeta.
  • Thuật toán: Đếm tần suất trên 2^20 mask và chạy superset zeta, thu superCnt[m]. Có 2^{superCnt[m]}-1 tập con không rỗng mà mọi phần tử đều chứa m. Cộng đại lượng này với dấu (-1)^{popcount(m)} trên mọi m.
  • Chứng minh đúng đắn: Với mỗi bit b, gọi E_b là sự kiện bit đó còn trong AND của tập đã chọn. Đáp án là số tập không thuộc hợp các E_b. Giao các sự kiện ứng với mask m yêu cầu mọi phần tử được chọn là supermask của m, có đúng 2^{superCnt[m]}-1 cách. Công thức bao hàm-loại trừ cho phần bù của hợp chính là tổng với dấu theo parity của m, nên thuật toán đếm đúng các tập có AND bằng 0.
  • Độ phức tạp: O(n + 20·2^20) thời gian và O(2^20+n) bộ nhớ.