rembocoder

Untitled

Apr 21st, 2023
888
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.92 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. //#define int int64_t
  6.  
  7. const int inf = 2e18;
  8. //const int mod = 1e9 + 7;
  9. const int mod = (1 << 30) + 1;
  10.  
  11. void ifmod(unsigned int& a) {
  12.     if (a >= mod) {
  13.         a -= mod;
  14.     }
  15. }
  16.  
  17. int32_t main() {
  18.     freopen("m3.in", "r", stdin);
  19.     freopen("m3.out", "w", stdout);
  20.     ios_base::sync_with_stdio(0);
  21.     cin.tie(0); cout.tie(0);
  22.     int n, m;
  23.     cin >> n >> m;
  24.     if (n < m) {
  25.         swap(n, m);
  26.     }
  27.     vector<vector<unsigned int>> dp(m, vector<unsigned int>(1 << (m + 1)));
  28.     dp[0][0] = 1;
  29.     for (int i = 0; i < n; i++) {
  30.         vector<vector<unsigned int>> new_dp(m, vector<unsigned int>(1 << (m + 1)));
  31.         for (int j = 0; j < m; j++) {
  32.             for (int mask = 0; mask < (1 << (m + 1)); mask++) {
  33.                 for (int b = 0; b < 2; b++) {
  34.                     if (i == 0 || j == 0 || bool(mask & (1 << (j - 1))) != b ||
  35.                                             bool(mask & (1 << j)) != b ||
  36.                                             bool(mask & (1 << (j + 1))) != b) {
  37.                         int new_mask = mask;
  38.                         if (new_mask & (1 << j)) {
  39.                             new_mask -= 1 << j;
  40.                         }
  41.                         if (b) {
  42.                             new_mask += 1 << j;
  43.                         }
  44.                         if (j == m - 1) {
  45.                             new_mask <<= 1;
  46.                             new_mask &= (1 << (m + 1)) - 1;
  47.                             ifmod(new_dp[0][new_mask] += dp[j][mask]);
  48.                         } else {
  49.                             ifmod(dp[j + 1][new_mask] += dp[j][mask]);
  50.                         }
  51.                     }
  52.                 }
  53.             }
  54.         }
  55.         dp = new_dp;
  56.     }
  57.     unsigned int ans = 0;
  58.     for (int mask = 0; mask < (1 << (m + 1)); mask++) {
  59.         ifmod(ans += dp[0][mask]);
  60.     }
  61.     cout << ans;
  62. }
  63.  
Advertisement
Add Comment
Please, Sign In to add comment