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

Submission Time
Task G - Count Strictly Increasing Sequences
User Chanyuh
Language C++ (GCC 9.2.1)
Score 0
Code Size 4999 Byte
Status WA
Exec Time 88 ms
Memory 11240 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 0 / 600
Status
AC × 1
WA × 2
AC × 17
WA × 56
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