canuc80k4403·4/50

Chọn Ô Không Chung Cạnh

Nộp bài trên LQDOJ

Bài 44 · Broken Profile DP

Cho một bảng . Mỗi ô có giá trị nếu được phép chọn và nếu không được phép chọn.

Hãy đếm số cách chọn một tập các ô được phép sao cho không có hai ô được chọn nào chung cạnh. Tập rỗng cũng được tính là một cách.

Input

  • Dòng đầu chứa hai số nguyên và .
  • Mỗi trong dòng tiếp theo chứa số nguyên, mỗi số là hoặc , mô tả một hàng của bảng.

Output

  • In số cách chọn, lấy phần dư theo .

Constraints

  • .

Scoring

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

Example

Test 1

Input

1 3
1 1 1

Output

5

Giải thích: Có tập rỗng, ba cách chọn đúng một ô và một cách chọn hai ô ở hai đầu hàng. Tổng cộng có cách.

Lời giải tóm tắt
  • Ý tưởng: Sinh trước các mask hàng không chứa hai bit 1 kề nhau. Ở hàng r, mask còn phải là tập con của các ô mang giá trị 1. Hai mask của hai hàng liên tiếp tương thích khi chúng không có bit chung, vì hai ô cùng cột sẽ chung cạnh dọc.
  • Đúng đắn: Điều kiện nội bộ của mask loại mọi cặp kề ngang. Điều kiện giữa cur và prev loại mọi cặp kề dọc. Lưới chỉ có hai loại cạnh này, nên dãy mask được DP chấp nhận tương ứng một-một với các tập ô hợp lệ. Cộng mọi trạng thái cuối vì hàng cuối có thể dùng bất kỳ mask hợp lệ nào.
  • Độ phức tạp: Gọi V là số mask không có hai bit kề nhau. Thời gian O(N·V²), bộ nhớ O(2^M).