Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- template <typename T>
- void print(T *a, int n) {
- for (int i = 1; i < n; ++i)
- cout << a[i] << " " ;
- cout << a[n] << endl;
- }
- int n, m;
- ll t;
- char op;
- const int N = 15;
- bool poss[N][N];
- bool vis[N][N];
- int rmsk[N];
- int cmsk[N];
- ll p9[N];
- int lookup[1 << 10];
- pair<int, int> pts[N];
- inline int lowbit(int x) {
- return x & (-x);
- }
- template<typename T>
- int go(int idx, int nvis, T cur) {
- if (op == '+' && cur + 9 * (m - nvis) < t)
- return 0;
- if (op == '+' && cur + (m - nvis) > t)
- return 0;
- if (op == '*' && (cur * p9[m - nvis] < t || cur > t))
- return 0;
- int r = pts[idx].first;
- int c = pts[idx].second;
- if (nvis + 1 == m) {
- if (op == '+') {
- T last = t - cur;
- if (last > n || last <= 0) return 0;
- --last;
- if (rmsk[r] & (1 << last)) return 0;
- if (cmsk[c] & (1 << last)) return 0;
- return 1;
- }
- if (op == '*') {
- if (t % cur != 0)
- return 0;
- T last = t / cur;
- if (last > n) return 0;
- --last;
- if (rmsk[r] & (1 << last)) return 0;
- if (cmsk[c] & (1 << last)) return 0;
- return 1;
- }
- }
- int ans = 0;
- int msk = ((1 << n) - 1) ^ (cmsk[c] | rmsk[r]);
- for ( ; msk; msk -= lowbit(msk)) {
- int cur_v = lowbit(msk);
- int want = lookup[cur_v] + 1;
- vis[r][c] = true;
- rmsk[r] ^= cur_v;
- cmsk[c] ^= cur_v;
- T nxt = op == '+' ? cur + want : cur * want;
- ans += go(idx + 1, nvis + 1, nxt);
- vis[r][c] = false;
- rmsk[r] ^= cur_v;
- cmsk[c] ^= cur_v;
- }
- return ans;
- }
- int main() {
- ios_base::sync_with_stdio(false);
- #ifdef CMU1
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- double start_time = clock();
- cin >> n >> m >> t >> op;
- for (int i = 0; i < m; i++) {
- int r, c;
- cin >> r >> c;
- pts[i] = make_pair(r, c);
- }
- p9[0] = 1;
- for (int i = 1; i <= m; i++)
- p9[i] = 9LL * p9[i - 1];
- lookup[1] = 0;
- int now = 1;
- for (int i = 2; i <= 10; ++i) {
- now *= 2;
- lookup[now] = i - 1;
- }
- if (op == '-' || op == '/') {
- if (t > 10000) {
- cout << "0\n";
- exit(0);
- }
- int tot = 0;
- for (int i = 1; i <= n; i++) {
- for (int j = 1; j <= n; j++) {
- if (op == '-' && max(i, j) - min(i, j) == t)
- tot++;
- if (op == '/' && i != j && min(i, j) * t == max(i, j)) {
- tot++;
- }
- }
- }
- cout << tot << '\n';
- return 0;
- }
- int start = (op == '+') ? 0 : 1;
- ll ans = op == '+' ? go<int>(0, 0, start)
- : go<ll>(0, 0, start);
- cout << ans << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement