fork(2) download
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <string.h>
  5. #include <map>
  6. #include <cstdio>
  7. using namespace std;
  8. #define ll long long
  9.  
  10. map < vector<int>, ll > dp;
  11. int a, b;
  12.  
  13. ll f(int row, vector <int> v)
  14. {
  15. if(dp.count(v))
  16. return dp[v];
  17.  
  18. if(v[row] == 0)
  19. return dp[v] = f(row+1, v);
  20.  
  21. ll &ref = dp[v];
  22. ref = 0;
  23. for(ll j = 0; j < b-1; j ++)
  24. {
  25. if( v[row]&(1<<j) && v[row]&(1<<(j+1)) )
  26. {
  27. v[row] = v[row] ^ (1<<j) ^ (1<<(j+1));
  28. ref += f(row, v);
  29. v[row] = v[row] | (1<<j) | (1<<(j+1));
  30.  
  31. if(row < a-1)
  32. {
  33. if( v[row+1] & (1<<j) )
  34. {
  35. v[row] = v[row] ^ (1<<j);
  36. v[row+1] = v[row+1] ^ (1<<j);
  37. ref += f(row, v);
  38. }
  39. }
  40. return ref;
  41. }
  42. }
  43. if(row < a-1)
  44. {
  45. for(ll j = 0; j < b; j ++)
  46. {
  47. if(v[row]&(1<<j) && v[row+1]&(1<<j))
  48. {
  49. v[row] = v[row] ^ (1<<j);
  50. v[row+1] = v[row+1] ^ (1<<j);
  51. ref += f(row, v);
  52. return ref;
  53. }
  54. }
  55. }
  56. return ref;
  57. }
  58.  
  59. ll mat[128][128];
  60.  
  61. int main()
  62. {
  63. //freopen("a.in", "r", stdin);
  64. //freopen("a.out", "w", stdout);
  65.  
  66. memset(mat, -1, sizeof mat);
  67.  
  68. for(int x = 1; x <= 100; x ++)
  69. for(int y = 1; y <= 100; y ++)
  70. //while(cin >> a >> b)
  71. {
  72. if(x*y > 100)
  73. continue;
  74. a = x;
  75. b = y;
  76.  
  77. dp.clear();
  78. //if(a == 0 || b == 0)
  79. //while(true);
  80.  
  81. if(a < b)
  82. swap(a, b);
  83.  
  84. vector <int> v(a, 0);
  85. dp[v] = 1;
  86. for(int i = 0; i < a; i ++)
  87. v[i] = (1<<b)-1;
  88.  
  89. ll res;
  90. if( a*b % 2 == 1 )
  91. res = 0;
  92. else
  93. res = f(0, v);
  94. mat[a][b] = mat[b][a] = res;
  95. //cout << res << endl;
  96. }
  97. while(cin >> a >> b)
  98. {
  99. if(mat[a][b] == -1 && mat[b][a] == -1)
  100. while(true);
  101.  
  102. //printf("%lld\n", res);
  103. /*if(mat[a][b] == -1)
  104.   cout << mat[b][a] << endl;
  105.   else
  106.   cout << mat[a][b] << endl;*/
  107. if(a < b)
  108. swap(a, b);
  109. printf("mat[%d][%d] = %lldLL;\n", a, b, mat[a][b]);
  110. }
  111.  
  112. return 0;
  113. }
Success #stdin #stdout 0s 3168KB
stdin
25 4
26 1
26 2
26 3
stdout
mat[25][4] = 0LL;
mat[26][1] = 0LL;
mat[26][2] = 0LL;
mat[26][3] = 0LL;