Cho một bảng N×M. Mỗi ô có giá trị 1 nếu được phép chọn và 0 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 N và M.
Mỗi trong N dòng tiếp theo chứa M số nguyên, mỗi số là 0 hoặc 1, mô tả một hàng của bảng.
Output
In số cách chọn, lấy phần dư theo 108.
Constraints
1≤N,M≤12.
Scoring
Subtask 1 (50% số điểm): N≤6 và M≤6.
Subtask 2 (50% 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ó 5 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).