fork download
  1. #include<bits/stdc++.h>
  2. #define X first
  3. #define Y second
  4. #define all(x) begin(x), end(x)
  5. #define FOR(i, a, b) for(int i = (a); i <= (b); i++)
  6. #define FORD(i, b, a) for(int i = (b); i >= (a); i--)
  7. #define REP(i, a, b) for (int i = (a); i < (b); i++)
  8. #define mxx max_element
  9. #define mnn min_element
  10. #define SQR(x) (1LL * (x) * (x))
  11. #define MASK(i) (1LL << (i))
  12. #define Point Vector
  13. #define left Left
  14. #define right Right
  15. #define div Div
  16.  
  17. using namespace std;
  18.  
  19. typedef long long ll;
  20. typedef unsigned long long ull;
  21. typedef double db;
  22. typedef long double ld;
  23. typedef pair<db, db> pdb;
  24. typedef pair<ld, ld> pld;
  25. typedef pair<int, int> pii;
  26. typedef pair<int, pii> piii;
  27. typedef pair<ll, ll> pll;
  28. typedef pair<ll, pll> plll;
  29. typedef pair<ll, int> pli;
  30. typedef pair<ll, pii> plii;
  31.  
  32. template<class A, class B>
  33. bool maximize(A& x, B y) {
  34. if (x < y) return x = y, true; else return false;
  35. }
  36. template<class A, class B>
  37. bool minimize(A& x, B y) {
  38. if (x > y) return x = y, true; else return false;
  39. }
  40.  
  41. /* END OF TEMPLATE */
  42.  
  43. int cnt_state = 0;
  44.  
  45. void dq(int col, int mask) {
  46. if (col > 5) {
  47. cnt_state++;
  48. return ;
  49. }
  50. for (int mask2 = mask; mask2 > 0; mask2 = (mask2 - 1) & mask) dq(col + 1, mask2);
  51. }
  52.  
  53. const int N = 1e3 + 7;
  54. const int mod = 1e9 + 7;
  55.  
  56. int n, m;
  57.  
  58. map<vector<int>, int> dp[7][N];
  59.  
  60. void add(int& x, int y) {
  61. if ((x+=y) >= mod) x-=mod;
  62. }
  63.  
  64. vector<int> shift_left(vector<int> state) {
  65. vector<int> res;
  66. for (int i = 1; i < m; i++) res.push_back(state[i]);
  67. res.push_back(0);
  68. return res;
  69. }
  70.  
  71. int dq(int row, int col, vector<int> state) {
  72. if (col > n) return 1;
  73. if (dp[row][col].find(state) != dp[row][col].end()) return dp[row][col][state];
  74. int& res = dp[row][col][state];
  75. if (row == m) res = dq(0, col + 1, shift_left(state)); else {
  76. // // state[0] la trang thai cua cot col
  77. if (state[0] & MASK(row)) res = dq(row + 1, col, state); else {
  78. for (int i = row; i < m; i++)
  79. if (state[0] & MASK(i)) break; else {
  80. int sz = i - row + 1;
  81. if (col + sz - 1 > n) break;
  82. vector<int> new_state = state;
  83. // bat bit
  84. for (int j = 0; j < sz; j++)
  85. for (int k = row; k <= i; k++) new_state[j]|=MASK(k);
  86. add(res, dq(i + 1, col, new_state));
  87. }
  88. }
  89. }
  90. return res;
  91. }
  92.  
  93. int main() {
  94. ios_base::sync_with_stdio(0);
  95. cin.tie(0);
  96. cin>>n>>m;
  97. vector<int> st(m, 0);
  98. cout<<dq(0, 1, st);
  99. return 0;
  100. }
  101.  
  102.  
  103.  
  104.  
Success #stdin #stdout 0.01s 5308KB
stdin
Standard input is empty
stdout
1