Advertisement
Guest User

Untitled

a guest
Oct 19th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.56 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6.  
  7. template <typename T>
  8. void print(T *a, int n) {
  9. for (int i = 1; i < n; ++i)
  10. cout << a[i] << " " ;
  11. cout << a[n] << endl;
  12. }
  13.  
  14. int n, m;
  15. ll t;
  16. char op;
  17.  
  18. const int N = 15;
  19. bool poss[N][N];
  20. bool vis[N][N];
  21. int rmsk[N];
  22. int cmsk[N];
  23. ll p9[N];
  24. int dx[4] = {1, -1, 0, 0};
  25. int dy[4] = {0, 0, 1, -1};
  26. int lookup[1 << 10];
  27.  
  28. inline int lowbit(int x) {
  29. return x & (-x);
  30. }
  31.  
  32. template<typename T>
  33. int go(int r, int c, int nvis, T cur) {
  34. if (vis[r][c])
  35. return 0;
  36. // if (cur > t)
  37. // return 0;
  38. if (op == '+' && cur + 9 * (m - nvis + 1) / 2 + 8 * (m - nvis) / 2 < t)
  39. return 0;
  40. if (op == '+' && cur + (m - nvis) > t)
  41. return 0;
  42. if (op == '*' && cur * p9[m - nvis] < t)
  43. return 0;
  44. if (nvis + 1 == m) {
  45. if (op == '+') {
  46. T last = t - cur;
  47. if (last > n || last <= 0) return 0;
  48. --last;
  49. if (rmsk[r] & (1 << last)) return 0;
  50. if (cmsk[c] & (1 << last)) return 0;
  51. return 1;
  52. }
  53. // if (op == '*') {
  54. if (t % cur != 0)
  55. return 0;
  56. T last = t / cur;
  57. if (last > n) return 0;
  58. --last;
  59. if (rmsk[r] & (1 << last)) return 0;
  60. if (cmsk[c] & (1 << last)) return 0;
  61. return 1;
  62. // }
  63. }
  64. int ans = 0;
  65. int msk = ((1 << n) - 1) ^ (cmsk[c] | rmsk[r]);
  66. for ( ; msk; msk -= lowbit(msk)) {
  67. int cur_v = lowbit(msk);
  68. int want = lookup[cur_v] + 1;
  69. for (int i = 0; i < 4; i++) {
  70. if (poss[r + dx[i]][c + dy[i]]) {
  71. vis[r][c] = true;
  72. rmsk[r] ^= cur_v;
  73. cmsk[c] ^= cur_v;
  74. T nxt = op == '+' ? cur + want : cur * want;
  75. ans += go(r + dx[i], c + dy[i], nvis + 1, nxt);
  76. vis[r][c] = false;
  77. rmsk[r] ^= cur_v;
  78. cmsk[c] ^= cur_v;
  79. }
  80. }
  81. }
  82. return ans;
  83. }
  84.  
  85. int main() {
  86. ios_base::sync_with_stdio(false);
  87. #ifdef CMU1
  88. freopen("input.txt", "r", stdin);
  89. freopen("output.txt", "w", stdout);
  90. #endif
  91. double start_time = clock();
  92. cin >> n >> m >> t >> op;
  93. for (int i = 0; i < m; i++) {
  94. int r, c;
  95. cin >> r >> c;
  96. poss[r][c] = true;
  97. }
  98. p9[0] = 1;
  99. for (int i = 1; i <= m; i++)
  100. p9[i] = 9LL * p9[i - 1];
  101. lookup[1] = 0;
  102. int now = 1;
  103. for (int i = 2; i <= 10; ++i) {
  104. now *= 2;
  105. lookup[now] = i - 1;
  106. }
  107. if (op == '-' || op == '/') {
  108. if (t > 10000) {
  109. cout << "0\n";
  110. exit(0);
  111. }
  112. int tot = 0;
  113. for (int i = 1; i <= n; i++) {
  114. for (int j = 1; j <= n; j++) {
  115. if (op == '-' && max(i, j) - min(i, j) == t)
  116. tot++;
  117. if (op == '/' && i != j && min(i, j) * t == max(i, j)) {
  118. tot++;
  119. }
  120. }
  121. }
  122. cout << tot << '\n';
  123. return 0;
  124. }
  125. int start = (op == '+') ? 0 : 1;
  126. for (int i = 0; i < n; i++) {
  127. for (int j = 0; j < m; j++) {
  128. if (poss[i][j]) {
  129. ll ans = op == '+' ? go<int>(i, j, 0, start)
  130. : go<ll>(i, j, 0, start);
  131. cout << ans << '\n';
  132. goto end;
  133. }
  134. }
  135. }
  136. end:
  137. cout << (clock() - start_time) / (double)CLOCKS_PER_SEC << '\n';
  138. return 0;
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement