intmain(){ cin >> n >> m; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cin >> a[i][j]; if (a[i][j] == 0) { c[i] += (1 << (j - 1)); } } }
cnt = 0; for (int i = 0; i < (1 << m); i++) { if (!judge1(i)) { b[cnt++] = i; //可行状态(未区别01) } } for (int i = 0; i < cnt; i++) { if (!judge2(1, i)) { dp[1][i] = 1; } } for (int i = 2; i <= n; i++) { for (int j = 0; j < cnt; j++) { // j代表上一行的状态 if (judge2(i, j)) continue; for (int k = 0; k < cnt; k++) { if (judge2(i - 1, k)) continue; if (!(b[k] & b[j])) dp[i][j] += dp[i - 1][k]; } } } int ans = 0; for (int i = 0; i < cnt; i++) { ans = (ans + dp[n][i]) % mod; } cout << ans << '\n';