Advertisement
pb_jiang

abc237f WA

Oct 24th, 2022
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.58 KB | None | 0 0
  1. // Problem: F - |LIS| = 3
  2. // Contest: AtCoder - AtCoder Beginner Contest 237
  3. // URL: https://atcoder.jp/contests/abc237/tasks/abc237_f
  4. // Memory Limit: 1024 MB
  5. // Time Limit: 2000 ms
  6. //
  7. // Powered by CP Editor (https://cpeditor.org)
  8.  
  9. #include <assert.h>
  10. #include <bits/stdc++.h>
  11. using namespace std;
  12. #define dbg(...) logger(#__VA_ARGS__, __VA_ARGS__)
  13. template <typename... Args> void logger(string vars, Args &&... values)
  14. {
  15.     cerr << vars << " = ";
  16.     string delim = "";
  17.     (..., (cerr << delim << values, delim = ", "));
  18.     cerr << endl;
  19. }
  20.  
  21. template <class T> using mpq = priority_queue<T, vector<T>, greater<T>>;
  22. using ll = long long;
  23. using pii = pair<int, int>;
  24.  
  25. int n, m;
  26. ll mod = 998244353;
  27.  
  28. int main(int argc, char **argv)
  29. {
  30.     cin >> n >> m;
  31.     int b = m + 1;
  32.     int state = b * b * b;
  33.     vector<vector<ll>> dp(n + 1, vector<ll>(state));
  34.     dp[0][0] = 1;
  35.     for (int i = 1; i <= n; ++i) {
  36.         for (int j = 0; j < state; ++j) {
  37.             if (dp[i - 1][j]) {
  38.                 int a1 = j % b;
  39.                 int a2 = (j / b) % b;
  40.                 int a3 = (j / b / b) % b;
  41.                 for (int k = 1; k < b; ++k) {
  42.                     int ns = -1;
  43.                     if (a1 == 0) {
  44.                         ns = k;
  45.                     } else if (a2 == 0) {
  46.                         if (k <= a1) {
  47.                             ns = k;
  48.                         } else {
  49.                             ns = a1 + k * b;
  50.                         }
  51.                     } else if (a3 == 0) {
  52.                         if (k <= a1) {
  53.                             ns = k + a2 * b;
  54.                         } else if (k <= a2) {
  55.                             ns = a1 + k * b;
  56.                         } else {
  57.                             ns = a1 + a2 * b + k * b * b;
  58.                         }
  59.                     } else {
  60.                         if (k <= a1) {
  61.                             ns = k + a2 * b + a3 * b * b;
  62.                         } else if (k <= a2) {
  63.                             ns = a1 + k * b + a3 * b * b;
  64.                         } else if (k <= a3) {
  65.                             ns = a1 + a2 * b + k * b * b;
  66.                         } else {
  67.                             // invalid
  68.                         }
  69.                     }
  70.                     if (ns != -1) {
  71.                         dp[i][ns] = (dp[i][ns] + dp[i - 1][j]) % mod;
  72.                     }
  73.                 }
  74.             }
  75.         }
  76.     }
  77.     ll ans = 0;
  78.     for (int i = 0; i < state; ++i) {
  79.         ans += dp[n][i];
  80.     }
  81.     cout << (ans % mod) << endl;
  82.     return 0;
  83. };
  84.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement