fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const ll LINF = 1e18;
  9. const int INF = 1e9;
  10.  
  11. int n, m;
  12. ll dp[31][1 << 5]; // dp[i][mask] = Số cách xếp thoả mãn khi xét đến hàng/cột thứ i
  13. // với mask là trạng thái của hàng/cột thứ i (bit là 1: ô có bò, bit là 0: ô đất trống)
  14.  
  15. int getBit(int mask, int i) {
  16. return ((mask >> i) & 1);
  17. }
  18.  
  19. bool valid(int mask, int next_mask) {
  20. for (int j = 0; j + 1 < m; j++) {
  21. if (getBit(mask, j) == getBit(mask, j + 1) && getBit(next_mask, j) == getBit(next_mask, j + 1) && getBit(mask, j) == getBit(next_mask, j)) return false;
  22. }
  23. return true;
  24. }
  25.  
  26. void solve() {
  27. cin >> n >> m;
  28. if (n < m) swap(n, m);
  29.  
  30. for (int i = 1; i <= n; i++) {
  31. for (int mask = 0; mask < (1 << m); mask++) dp[i][mask] = 0;
  32. }
  33.  
  34. for (int mask = 0; mask < (1 << m); mask++) dp[1][mask] = 1;
  35.  
  36. for (int i = 1; i < n; i++) {
  37. for (int mask = 0; mask < (1 << m); mask++) {
  38. if (dp[i][mask] == 0) continue;
  39. for (int next_mask = 0; next_mask < (1 << m); next_mask++) {
  40. if (!valid(mask, next_mask)) continue;
  41. dp[i + 1][next_mask] += dp[i][mask];
  42. }
  43. }
  44. }
  45.  
  46. ll ans = 0;
  47. for (int mask = 0; mask < (1 << m); mask++) {
  48. ans += dp[n][mask];
  49. }
  50.  
  51. cout << ans << '\n';
  52. }
  53.  
  54. signed main() {
  55. ios::sync_with_stdio(false);
  56. cin.tie(nullptr);
  57. int tt;
  58. cin >> tt;
  59. while (tt--) {
  60. solve();
  61. }
  62. }
  63.  
Success #stdin #stdout 0s 5276KB
stdin
1
1 1
stdout
2