Advertisement
Guest User

Untitled

a guest
Nov 6th, 2022
1,221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.75 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int p2[5001], dp[5001][5001], sum[5001][5001], sum2[5001][5001];
  4. int32_t main()
  5. {
  6.     int n, mod;
  7.     cin >> n >> mod;
  8.     p2[0] = 1;
  9.     for (int i = 1; i <= n; ++i)
  10.     {
  11.         p2[i] = p2[i - 1] + p2[i - 1];
  12.         if (p2[i] >= mod)
  13.         {
  14.             p2[i] -= mod;
  15.         }
  16.     }
  17.     dp[1][1] = 1;
  18.     for (int j = 1; j <= n; ++j)
  19.     {
  20.         sum[1][j] = 1;
  21.         sum2[1][j] = 1;
  22.     }
  23.     for (int i = 2; i <= n; ++i)
  24.     {
  25.         for (int j = 1; j <= i; ++j)
  26.         {
  27.             if (i == j)
  28.             {
  29.                 dp[i][j] = p2[i - 2];
  30.                 for (int k = 1; k < i; ++k)
  31.                 {
  32.                     dp[i][j] -= dp[i][k];
  33.                     if (dp[i][j] < 0)
  34.                     {
  35.                         dp[i][j] += mod;
  36.                     }
  37.                 }
  38.                 continue;
  39.             }
  40.             int lg = j + 1;
  41.             if (i - j - lg >= 0)
  42.             {
  43.                 dp[i][j] = (1ll * dp[j][j] * sum2[i - j - lg][lg - j - 1]) % mod;
  44.             }
  45.         }
  46.         for (int j = 1; j <= i; ++j)
  47.         {
  48.             sum[i][j] = sum[i][j - 1] + dp[i][j];
  49.             if (sum[i][j] >= mod)
  50.             {
  51.                 sum[i][j] -= mod;
  52.             }
  53.         }
  54.         for (int j = i + 1; j <= n; ++j)
  55.         {
  56.             sum[i][j] = sum[i][j - 1];
  57.         }
  58.         for (int j = 0; j <= n; ++j)
  59.         {
  60.             sum2[i][j] = sum[i][j];
  61.             if (j + 1 <= n)
  62.             {
  63.                 sum2[i][j] += sum2[i - 1][j + 1];
  64.                 if (sum2[i][j] >= mod)
  65.                 {
  66.                     sum2[i][j] -= mod;
  67.                 }
  68.             }
  69.         }
  70.     }
  71.     cout << dp[n][n];
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement