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';
#include<bits/stdc++.h> usingnamespacestd; using ll = longlong;
int n, m; int a[10]; int dp[10][2];
ll dfs(int pos, int pre, int sta, bool limit){ if (pos == -1) return1; if (!limit && dp[pos][sta] != -1) return dp[pos][sta]; int up = limit ? a[pos] : 9; ll ans = 0; for (int i = 0; i <= up; i++) { if (i == 4 || (pre == 6 && i == 2)) continue; ans += dfs(pos - 1, i, i == 6, limit && i == a[pos]); } if (!limit) dp[pos][sta] = ans; return ans; }
ll solve(int x){ int cnt = 0; while (x) { a[cnt++] = x % 10; x /= 10; } return dfs(cnt - 1, -1, 0, 1); }
intmain(){ memset(dp, -1, sizeof dp); while (cin >> n >> m && (n || m)) { cout << solve(m) - solve(n - 1) << '\n'; }