Advertisement
aayyk

Untitled

Oct 18th, 2020
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.80 KB | None | 0 0
  1. //#pragma GCC optimize("Ofast,unroll-loops")
  2.  
  3. #ifdef LOCAL
  4. #include "debug.h"
  5. #else
  6. #include <bits/stdc++.h>
  7. #include <ext/pb_ds/assoc_container.hpp>
  8. #include <ext/pb_ds/tree_policy.hpp>
  9. #define debug(x...)
  10. #endif
  11.  
  12. using namespace std;
  13.  
  14. #define int ll
  15.  
  16. typedef long long ll;
  17. typedef long double ld;
  18. typedef pair <int, int> pii;
  19. #define sz(x) int((x).size())
  20.  
  21. template <typename T>
  22. using ordered_set = __gnu_pbds::tree <T, __gnu_pbds::null_type, less<T>, __gnu_pbds::rb_tree_tag, __gnu_pbds::tree_order_statistics_node_update>;
  23.  
  24. #ifdef ONLINE_JUDGE
  25. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  26. #else
  27. mt19937 rng(1000 - 7);
  28. #endif
  29.  
  30. const int N = 6;
  31. const int M = 1e3 + 10;
  32. //const int MOD = 998244353;
  33. const ll MOD = 1e9 + 9;
  34. const ld eps = 5e-8;
  35. const pii dir[] = { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 } };
  36.  
  37. int n, m, k;
  38. int a[N][M], dp[M][(1 << N)];
  39.  
  40. inline int get(int x, int i) {
  41.     return x >> i & 1;
  42. }
  43.  
  44. bool check(int j, int x, int y) {
  45.     if (get(y, 0) && !get(y, 1) || get(y, n - 1) && !get(y, n - 2)) {
  46.         return false;
  47.     }
  48.     for (int i = 1; i < n - 1; i++) {
  49.         if (get(y, i) && !get(y, i - 1) && !get(y, i + 1)) {
  50.             return false;
  51.         }
  52.     }
  53.  
  54.     for (int i = 1; i < n; i++) {
  55.         if (get(y, i) && get(y, i - 1) && (get(x, i) || get(x, i - 1))) {
  56.             return false;
  57.         }
  58.         if (get(y, i) && get(y, i - 1) &&
  59.             (a[j][i] || a[j + 1][i] || a[j][i - 1] || a[j + 1][i - 1])) {
  60.                 return false;
  61.             }
  62.     }
  63.  
  64.     return true;
  65. }
  66.  
  67. inline void relax(int& x, int y) {
  68.     x = (x + y) % MOD;
  69. }
  70.  
  71. signed main() {
  72. #ifdef LOCAL
  73.     freopen("input.txt", "r", stdin);
  74.     freopen("output.txt", "w", stdout);
  75. #endif
  76.     cout << fixed << setprecision(9);
  77.     ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  78.  
  79.     cin >> n >> m >> k;
  80.  
  81.     for (int i = 0; i < k; i++) {
  82.         int x, y;
  83.         cin >> x >> y;
  84.         a[y - 1][x - 1] = 1;
  85.     }
  86.  
  87.     dp[0][0] = 1;
  88.     for (int i = 0; i < m; i++) {
  89.         for (int mask1 = 0; mask1 < (1 << n); mask1++) {
  90.             bool flag = true;
  91.             for (int j = 0; j < n && flag; j++) {
  92.                 if (get(mask1, j) && a[i][j]) {
  93.                     flag = false;
  94.                 }
  95.             }
  96.  
  97.             if (!flag) {
  98.                 continue;
  99.             }
  100.  
  101.             if (mask1) {
  102.                 relax(dp[i][mask1], dp[i][0]);
  103.             }
  104.  
  105.             debug(i, mask1, dp[i][mask1]);
  106.  
  107.             for (int mask2 = 0; mask2 < (1 << n); mask2++) {
  108.                 if (!check(i, mask1, mask2)) {
  109.                     continue;
  110.                 }
  111.  
  112.                 relax(dp[i + 1][mask2], dp[i][mask1]);
  113.             }
  114.         }
  115.     }
  116.  
  117.     cout << dp[m][0] << endl;
  118.  
  119.     return 0;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement