Advertisement
Kevin_Zhang

Untitled

Jan 5th, 2021
1,431
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.64 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define pb emplace_back
  3. #define AI(i) begin(i), end(i)
  4. template<class T>
  5. bool chmax(T &val, T nv) {
  6.     return val < nv ? (val = nv, true) : false;
  7. }
  8. template<class T>
  9. bool chmin(T &val, T nv) {
  10.     return nv < val ? (val = nv, true) : false;
  11. }
  12. using namespace std;
  13. using ll = long long;
  14. #ifdef KEV
  15. #define DE(args...) kout("[ " + string(#args) + " ] = ", args)
  16. void debug(auto L, auto R) { while (L < R) cerr << *L << " \n"[L+1==R], ++L; }
  17. void kout(){ cerr << endl; }
  18. template<class T1, class ...T2> void kout(T1 a, T2 ...e) { cerr << a << ' ', kout(e...); }
  19. #else
  20. #define DE(...) 0
  21. #define debug(...) 0
  22. #endif
  23. // What I should check
  24. // 1. overflow
  25. // 2. corner cases
  26. // Enjoy the problem instead of hurrying to AC
  27. // Good luck !
  28. const int MAX_N = 20, p = 998244353;
  29. void add(int &a, int b) { a += b - p, a += (a>>31) & p; }
  30.  
  31. int n, m, a[MAX_N][MAX_N], pos[MAX_N][MAX_N];
  32.  
  33. int A[1<<MAX_N], B[1<<MAX_N];
  34.  
  35. int32_t main() {
  36.     ios_base::sync_with_stdio(0), cin.tie(0);
  37.     cin >> m >> n;
  38.     for (int i = 0;i < m;++i)
  39.         for (int j = 0;j < n;++j) {
  40.             cin >> a[i][j], --a[i][j];
  41.             pos[i][ a[i][j] ] = 1<<j;
  42.         }
  43.  
  44.     auto dp = A, tmp = B;
  45.     dp[0] = 1;
  46.     for (int d = 0;d < m;++d) {
  47.         memset(tmp, 0, sizeof(A));
  48.         for (int i = 0;i + 1 < n;++i)
  49.             for (int s = 0;s < 1<<n;++s) if (dp[s])
  50.                 if ((s & (0b11 << i)) == 0) {
  51.                     add(dp[s | (0b11<<i)], dp[s]);
  52.                 }
  53.         if (d == m-1)
  54.             return cout << dp[(1<<n)-1] << '\n', 0;
  55.  
  56.         for (int s = 0;s < 1<<n;++s) if (dp[s]) {
  57.             int mask = 0;
  58.             for (int i = 0;i < n;++i) if ( (~s>>i&1) )
  59.                 mask |= pos[d+1][a[d][i]];
  60.             tmp[mask] = dp[s];
  61.         }
  62.         swap(dp, tmp);
  63.     }
  64. }
  65.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement