Advertisement
Guest User

Untitled

a guest
Feb 25th, 2020
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.94 KB | None | 0 0
  1.  
  2. #include <bits/stdc++.h>
  3.  
  4. #define ll long long
  5. using namespace std;
  6.  
  7. const int N = 25, M = 1e3 + 5;
  8. ll n, m, p;
  9. ll dp[M][N / 2 + 1][1 << (N / 2)];
  10.  
  11. ll modpow(ll a, ll b) {
  12.     ll c = 1;
  13.     while(b--) c = (c * a) % p;
  14.     return c;
  15. }
  16.  
  17. int main() {
  18.     ios::sync_with_stdio(false);
  19.     cin.tie(0);
  20.     cin >> n >> m >> p;
  21.     if(n % 2 == 1 && m % 2 == 1) {
  22.         return cout << 1 << endl, 0;
  23.     }else if(n % 2 == 1 && m % 2 == 0) {
  24.         return cout << modpow(m/2 + 1, (n-1) / 2) << endl, 0;
  25.     }else if(n % 2 == 0 && m % 2 == 1) {
  26.         return cout << modpow(n/2 + 1, (m-1) / 2) << endl, 0;
  27.     }
  28.     n /= 2; m /= 2;
  29.     int M = (1 << n);
  30.     for(int i = 1; i <= m; i++) {
  31.         for(int R = 0; R <= n; R++) {
  32.             for(int mask = 0; mask < M; mask++) {
  33.                 if(i == 1) {
  34.                     dp[i][R][mask] = 1;
  35.                     continue;
  36.                 }
  37.                 int mask2 = mask;
  38.                 for(int r = R; r <= n; r++) {
  39.                     if(r - R >= 2 && ((mask >> (r - 1)) & 1)) {
  40.                         mask2 |= (1 << (r - 2));
  41.                     }
  42.                     (dp[i][R][mask] += dp[i - 1][r][mask2]) %= p;
  43.                 }
  44.                 mask2 = mask;
  45.                 for(int r = R - 1; r >= 0; r--) {
  46.                     if(R - r >= 2 && ((mask >> r) & 1)) {
  47.                         mask2 |= (1 << (r + 1));
  48.                     }
  49.                     (dp[i][R][mask] += dp[i - 1][r][mask2]) %= p;
  50.                 }
  51.             }
  52.             // sum over supersets
  53.             for(int k = 0; k < n; k++) {
  54.                 for(int mask = M - 1; mask >= 0; mask--) {
  55.                     if(((mask >> k) & 1) == 0) {
  56.                         (dp[i][R][mask] += dp[i][R][mask + (1 << k)]) %= p;
  57.                     }
  58.                 }
  59.             }
  60.         }
  61.     }
  62.     ll sum = 0;
  63.     for(int R = 0; R <= n; R++) (sum += dp[m][R][0]) %= p;
  64.     cout << sum << endl;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement