Submission #39443062
Source Code Expand
#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <ciso646>
#include <cmath>
#include <complex>
#include <cstdio>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <tuple>
#include <unordered_map>
#include <utility>
#include <vector>
using namespace std;
typedef long long ll;
const ll mod = 998244353;
const ll INF = (ll)1000000007 * 1000000007;
typedef pair<int, int> P;
#define rep(i, n) for (int i = 0; i < n; i++)
#define per(i, n) for (int i = n - 1; i >= 0; i--)
#define Rep(i, sta, n) for (int i = sta; i < n; i++)
#define Per(i, sta, n) for (int i = n - 1; i >= sta; i--)
#define fi first
#define se second
typedef long double ld;
const ld eps = 1e-8;
const ld pi = acos(-1.0);
typedef pair<ll, ll> LP;
int dx[8] = {1, -1, 0, 0, 1, 1, -1, -1};
int dy[8] = {0, 0, 1, -1, 1, -1, 1, -1};
template <class T> using max_heap = priority_queue<T>;
template <class T> using min_heap = priority_queue<T, vector<T>, greater<>>;
template <class T> bool chmax(T &a, const T &b) {
if (a < b) {
a = b;
return 1;
}
return 0;
}
template <class T> bool chmin(T &a, const T &b) {
if (b < a) {
a = b;
return 1;
}
return 0;
}
template <int mod> struct ModInt {
long long x;
static constexpr int MOD = mod;
ModInt() : x(0) {}
ModInt(long long y) : x(y >= 0 ? y % mod : (mod - (-y) % mod) % mod) {}
explicit operator int() const { return x; }
ModInt &operator+=(const ModInt &p) {
if ((x += p.x) >= mod) x -= mod;
return *this;
}
ModInt &operator-=(const ModInt &p) {
if ((x += mod - p.x) >= mod) x -= mod;
return *this;
}
ModInt &operator*=(const ModInt &p) {
x = (int)(1LL * x * p.x % mod);
return *this;
}
ModInt &operator/=(const ModInt &p) {
*this *= p.inverse();
return *this;
}
ModInt operator-() const { return ModInt(-x); }
ModInt operator+(const ModInt &p) const { return ModInt(*this) += p; }
ModInt operator-(const ModInt &p) const { return ModInt(*this) -= p; }
ModInt operator*(const ModInt &p) const { return ModInt(*this) *= p; }
ModInt operator/(const ModInt &p) const { return ModInt(*this) /= p; }
ModInt operator%(const ModInt &p) const { return ModInt(0); }
bool operator==(const ModInt &p) const { return x == p.x; }
bool operator!=(const ModInt &p) const { return x != p.x; }
ModInt inverse() const {
int a = x, b = mod, u = 1, v = 0, t;
while (b > 0) {
t = a / b;
a -= t * b;
swap(a, b);
u -= t * v;
swap(u, v);
}
return ModInt(u);
}
ModInt power(long long n) const {
ModInt ret(1), mul(x);
while (n > 0) {
if (n & 1) ret *= mul;
mul *= mul;
n >>= 1;
}
return ret;
}
ModInt power(const ModInt p) const { return ((ModInt)x).power(p.x); }
friend ostream &operator<<(ostream &os, const ModInt<mod> &p) { return os << p.x; }
friend istream &operator>>(istream &is, ModInt<mod> &a) {
long long x;
is >> x;
a = ModInt<mod>(x);
return (is);
}
};
using modint = ModInt<mod>;
modint dp[45][45][45][10];
bool visited[45][45][45][10];
int N, M;
int S[45][45];
bool check(int L, int R, int K, int mi) {
Rep(i, L, R) {
if (S[i][K] != -1 && S[i][K] != mi) return false;
}
return true;
}
modint calc_dp(int L, int R, int K, int mi) {
if (visited[L][R][K][mi]) return dp[L][R][K][mi];
if (R - L == 1) {
if (S[L][K] != -1 && S[L][K] != mi) {
visited[L][R][K][mi] = true;
return 0;
} else {
modint res = 1;
Rep(j, K + 1, M) if (S[L][j] == -1) res *= 10;
visited[L][R][K][mi] = true;
dp[L][R][K][mi] = res;
return res;
}
}
modint res = 0;
if (!check(L, R, K, mi)) {
visited[L][R][K][mi] = true;
return 0;
}
Rep(x, L + 1, R) {
if (!check(L, x, K, mi)) continue;
if (K == M - 1)
if (x > L + 1) continue;
modint S1 = 0, S2 = 0;
rep(j, 10) { S1 += calc_dp(L, x, K + 1, j); }
Rep(j, mi + 1, 10) { S2 += calc_dp(x + 1, R, K, j); }
res += S1 * S2;
}
visited[L][R][K][mi] = true;
dp[L][R][K][mi] = res;
return res;
}
void solve() {
cin >> N >> M;
rep(i, N) {
string s;
cin >> s;
rep(j, M) {
if (s[j] == '?') {
S[i][j] = -1;
} else {
S[i][j] = s[j] - '0';
}
}
}
modint ans = 0;
rep(i, 10) ans += calc_dp(0, N, 0, i);
cout << ans << endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout << fixed << setprecision(50);
solve();
}
Submission Info
Judge Result
| Set Name |
Sample |
All |
| Score / Max Score |
0 / 0 |
0 / 600 |
| Status |
|
|
| Set Name |
Test Cases |
| Sample |
00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt |
| All |
00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_rnd1_00.txt, 01_rnd1_01.txt, 01_rnd1_02.txt, 01_rnd1_03.txt, 01_rnd1_04.txt, 01_rnd1_05.txt, 01_rnd1_06.txt, 01_rnd1_07.txt, 02_rnd2_00.txt, 02_rnd2_01.txt, 02_rnd2_02.txt, 02_rnd2_03.txt, 02_rnd2_04.txt, 02_rnd2_05.txt, 02_rnd2_06.txt, 02_rnd2_07.txt, 03_allq_00.txt, 03_allq_01.txt, 03_allq_02.txt, 03_allq_03.txt, 03_allq_04.txt, 03_allq_05.txt, 03_allq_06.txt, 03_allq_07.txt, 03_allq_08.txt, 03_allq_09.txt, 03_allq_10.txt, 03_allq_11.txt, 03_allq_12.txt, 03_allq_13.txt, 03_allq_14.txt, 03_allq_15.txt, 03_allq_16.txt, 03_allq_17.txt, 03_allq_18.txt, 03_allq_19.txt, 03_allq_20.txt, 03_allq_21.txt, 03_allq_22.txt, 03_allq_23.txt, 04_noq_00.txt, 04_noq_01.txt, 04_noq_02.txt, 04_noq_03.txt, 04_noq_04.txt, 04_noq_05.txt, 04_noq_06.txt, 04_noq_07.txt, 05_hand_00.txt, 05_hand_01.txt, 05_hand_02.txt, 05_hand_03.txt, 05_hand_04.txt, 05_hand_05.txt, 05_hand_06.txt, 06_manyq_00.txt, 06_manyq_01.txt, 06_manyq_02.txt, 06_manyq_03.txt, 06_manyq_04.txt, 06_manyq_05.txt, 06_manyq_06.txt, 06_manyq_07.txt, 06_manyq_08.txt, 06_manyq_09.txt, 06_manyq_10.txt, 06_manyq_11.txt, 06_manyq_12.txt, 06_manyq_13.txt, 06_manyq_14.txt |
| Case Name |
Status |
Exec Time |
Memory |
| 00_sample_00.txt |
WA |
11 ms |
10568 KiB |
| 00_sample_01.txt |
AC |
9 ms |
10736 KiB |
| 00_sample_02.txt |
WA |
11 ms |
10692 KiB |
| 01_rnd1_00.txt |
AC |
9 ms |
10572 KiB |
| 01_rnd1_01.txt |
AC |
14 ms |
10744 KiB |
| 01_rnd1_02.txt |
AC |
12 ms |
10744 KiB |
| 01_rnd1_03.txt |
AC |
12 ms |
10704 KiB |
| 01_rnd1_04.txt |
AC |
10 ms |
10628 KiB |
| 01_rnd1_05.txt |
AC |
13 ms |
10748 KiB |
| 01_rnd1_06.txt |
AC |
9 ms |
10708 KiB |
| 01_rnd1_07.txt |
AC |
9 ms |
10740 KiB |
| 02_rnd2_00.txt |
WA |
10 ms |
10752 KiB |
| 02_rnd2_01.txt |
WA |
9 ms |
10628 KiB |
| 02_rnd2_02.txt |
WA |
11 ms |
10660 KiB |
| 02_rnd2_03.txt |
WA |
9 ms |
10736 KiB |
| 02_rnd2_04.txt |
WA |
12 ms |
10628 KiB |
| 02_rnd2_05.txt |
WA |
9 ms |
10560 KiB |
| 02_rnd2_06.txt |
WA |
8 ms |
10684 KiB |
| 02_rnd2_07.txt |
WA |
10 ms |
10624 KiB |
| 03_allq_00.txt |
WA |
8 ms |
10740 KiB |
| 03_allq_01.txt |
WA |
76 ms |
11160 KiB |
| 03_allq_02.txt |
WA |
11 ms |
10636 KiB |
| 03_allq_03.txt |
WA |
9 ms |
10568 KiB |
| 03_allq_04.txt |
WA |
86 ms |
11156 KiB |
| 03_allq_05.txt |
WA |
88 ms |
11236 KiB |
| 03_allq_06.txt |
WA |
87 ms |
11176 KiB |
| 03_allq_07.txt |
AC |
12 ms |
10776 KiB |
| 03_allq_08.txt |
WA |
13 ms |
11240 KiB |
| 03_allq_09.txt |
WA |
80 ms |
11224 KiB |
| 03_allq_10.txt |
WA |
79 ms |
11156 KiB |
| 03_allq_11.txt |
WA |
80 ms |
11112 KiB |
| 03_allq_12.txt |
AC |
10 ms |
10644 KiB |
| 03_allq_13.txt |
WA |
14 ms |
11044 KiB |
| 03_allq_14.txt |
WA |
73 ms |
11136 KiB |
| 03_allq_15.txt |
WA |
72 ms |
11196 KiB |
| 03_allq_16.txt |
WA |
72 ms |
11196 KiB |
| 03_allq_17.txt |
AC |
11 ms |
10808 KiB |
| 03_allq_18.txt |
WA |
17 ms |
11156 KiB |
| 03_allq_19.txt |
WA |
12 ms |
10620 KiB |
| 03_allq_20.txt |
WA |
11 ms |
10624 KiB |
| 03_allq_21.txt |
WA |
8 ms |
10676 KiB |
| 03_allq_22.txt |
WA |
9 ms |
10696 KiB |
| 03_allq_23.txt |
WA |
8 ms |
10692 KiB |
| 04_noq_00.txt |
AC |
8 ms |
10632 KiB |
| 04_noq_01.txt |
AC |
10 ms |
10744 KiB |
| 04_noq_02.txt |
AC |
9 ms |
10696 KiB |
| 04_noq_03.txt |
AC |
11 ms |
10648 KiB |
| 04_noq_04.txt |
WA |
14 ms |
10748 KiB |
| 04_noq_05.txt |
WA |
8 ms |
10656 KiB |
| 04_noq_06.txt |
WA |
10 ms |
10744 KiB |
| 04_noq_07.txt |
WA |
9 ms |
10700 KiB |
| 05_hand_00.txt |
WA |
9 ms |
10772 KiB |
| 05_hand_01.txt |
WA |
13 ms |
10772 KiB |
| 05_hand_02.txt |
WA |
13 ms |
11232 KiB |
| 05_hand_03.txt |
WA |
16 ms |
11148 KiB |
| 05_hand_04.txt |
WA |
12 ms |
10840 KiB |
| 05_hand_05.txt |
WA |
12 ms |
11116 KiB |
| 05_hand_06.txt |
WA |
17 ms |
10840 KiB |
| 06_manyq_00.txt |
WA |
83 ms |
11240 KiB |
| 06_manyq_01.txt |
WA |
84 ms |
11236 KiB |
| 06_manyq_02.txt |
WA |
84 ms |
11124 KiB |
| 06_manyq_03.txt |
WA |
75 ms |
11152 KiB |
| 06_manyq_04.txt |
WA |
83 ms |
11200 KiB |
| 06_manyq_05.txt |
WA |
76 ms |
11144 KiB |
| 06_manyq_06.txt |
WA |
9 ms |
10708 KiB |
| 06_manyq_07.txt |
WA |
64 ms |
11156 KiB |
| 06_manyq_08.txt |
WA |
56 ms |
11208 KiB |
| 06_manyq_09.txt |
WA |
12 ms |
10696 KiB |
| 06_manyq_10.txt |
WA |
33 ms |
11232 KiB |
| 06_manyq_11.txt |
WA |
54 ms |
11176 KiB |
| 06_manyq_12.txt |
WA |
62 ms |
11156 KiB |
| 06_manyq_13.txt |
AC |
12 ms |
10704 KiB |
| 06_manyq_14.txt |
WA |
76 ms |
11120 KiB |