rembocoder

Untitled

Apr 21st, 2023
843
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.47 KB | None | 0 0
  1. #pragma GCC optimize("Ofast,no-stack-protector")
  2. #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2")
  3. #pragma GCC optimize("unroll-loops")
  4. #include <bits/stdc++.h>
  5.  
  6. using namespace std;
  7.  
  8. //#define int int64_t
  9.  
  10. const int inf = 2e18;
  11. //const int mod = 1e9 + 7;
  12. const int mod = (1 << 30) + 1;
  13.  
  14. void ifmod(unsigned int& a) {
  15.     if (a >= mod) {
  16.         a -= mod;
  17.     }
  18. }
  19.  
  20. int32_t main() {
  21.     freopen("m3.in", "r", stdin);
  22.     freopen("m3.out", "w", stdout);
  23.     ios_base::sync_with_stdio(0);
  24.     cin.tie(0); cout.tie(0);
  25.     int n, m;
  26.     cin >> n >> m;
  27.     if (n < m) {
  28.         swap(n, m);
  29.     }
  30.     if (m == 1) {
  31.         unsigned int ans = 1;
  32.         for (int i = 0; i < n; i++) {
  33.             ans *= 2;
  34.             ans %= mod;
  35.         }
  36.         cout << ans;
  37.         return 0;
  38.     }
  39.     vector<vector<unsigned int>> dp(m, vector<unsigned int>(1 << (m + 1)));
  40.     dp[0][0] = 1;
  41.     for (int i = 0; i < n; i++) {
  42.         for (int j = 0; j < m - 1; j++) {
  43.             int check_mask = 0;
  44.             if (j > 0) {
  45.                 check_mask = (1 << (j - 1)) + (1 << j) + (1 << (j + 1));
  46.             }
  47.             for (int mask = 0; mask < (1 << (m + 1)); mask++) {
  48.                 for (int b = 0; b < 2; b++) {
  49.                     if (i == 0 || j == 0 || (mask & check_mask) != check_mask * b) {
  50.                         int new_mask = mask;
  51.                         new_mask &= ~(1 << j);
  52.                         new_mask += (1 << j) * b;
  53.                         ifmod(dp[j + 1][new_mask] += dp[j][mask]);
  54.                     }
  55.                 }
  56.                 dp[j][mask] = 0;
  57.             }
  58.         }
  59.         int j = m - 1;
  60.         int check_mask = 0;
  61.         if (j > 0) {
  62.             check_mask = (1 << (j - 1)) + (1 << j) + (1 << (j + 1));
  63.         }
  64.         for (int mask = 0; mask < (1 << (m + 1)); ++mask) {
  65.             for (int b = 0; b < 2; b++) {
  66.                 if (i == 0 || j == 0 || (mask & check_mask) != check_mask * b) {
  67.                     int new_mask = mask;
  68.                     new_mask &= ~(1 << j);
  69.                     new_mask += (1 << j) * b;
  70.                     new_mask <<= 1;
  71.                     new_mask &= (1 << (m + 1)) - 1;
  72.                     ifmod(dp[0][new_mask] += dp[j][mask]);
  73.                 }
  74.             }
  75.             dp[j][mask] = 0;
  76.         }
  77.     }
  78.     unsigned int ans = 0;
  79.     for (int mask = 0; mask < (1 << (m + 1)); mask++) {
  80.         ifmod(ans += dp[0][mask]);
  81.     }
  82.     cout << ans;
  83. }
  84.  
Advertisement
Add Comment
Please, Sign In to add comment