For this Question: Bodega is trying to go from point (0, 0) to (X, Y). In one move, Bodega can perform one of the following operations:
1. Go from (x, y) &rarr; (x', y), if x | x' = x' and x ≠ x'.
2. Go from (x, y) &rarr; (x, y'), if y | y' = y' and y ≠ y'.
where "|" denotes the bitwise OR operator.

However, a total of N points in the plane are blocked, so Bodega cannot go to those points. You are given the positions of these N blocked points. Find the number of different paths that Bodega can take modulo 998244353.The first line consists of a single integer T – the number of test cases. Then T test cases follow:
The first line of each test case contains two integers X and Y, where (X, Y) denotes Bodega's destination.
The second line contains a single integer N.
Then N lines follow, the i<sup>th</sup> line containing two integers X<sub>i</sub> and Y<sub>i</sub>, where (X<sub>i</sub>, Y<sub>i</sub>) denotes a blocked point.

<b>Constraints:</b>
1 &le; T &le; 1000
0 &le; X, Y &le; 10<sup>16</sup>
0 &le; N &le; 1000
0 &le; X<sub>i</sub> &le; X
0 &le; Y<sub>i</sub> &le; Y
The sum of N across all test cases does not exceed 1000.
Print T lines, the i<sup>th</sup> line containing the answer for the i<sup>th</sup> test case.Sample input 1:
1
2 2
1
2 0

Sample output 1:
1

Explanation:
There are only two possible paths if not considering the blocked points, (0,0) &rarr; (2,0) &rarr; (2,2) and (0,0) &rarr; (0,2) &rarr; (2,2). As the point (2, 0) is blocked, this leaves only one possible path.

Sample Input 2:
1
3 3
2
1 2
2 3

Sample Output 2:
26, I have written this Solution Code: #include <bits/stdc++.h>
#define int long long
using namespace std;
bool Begin;
const int max_n = 68, max_m = 10004, mod = 998244353;
inline int read() {
    int x = 0;
    bool w = 0;
    char c = getchar();

    while (c < '0' || c > '9')
        w |= c == '-', c = getchar();

    while (c >= '0' && c <= '9')
        x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();

    return w ? -x : x;
}
inline void write(int x) {
    if (x < 0)
        putchar('-'), x = -x;

    if (x > 9)
        write(x / 10);

    putchar(x % 10 ^ 48);
}
inline int mi(int a, int p = mod - 2) {
    int res = 1;

    while (p) {
        if (p & 1)
            res *= a, res %= mod;

        a *= a, a %= mod, p >>= 1;
    }

    return res;
}

int n, cnt, X, Y;
const int N = 66;

int fac[max_m], inv[max_m];
inline int C(int n, int m) {
    if (n < 0 || m < 0 || n < m)
        return 0;

    return fac[n] * inv[m] % mod * inv[n - m] % mod;
}

inline int calc(int x) {
    int res = 0;

    while (x)
        ++res, x -= x & -x;

    return res;
}

struct dot {
    int x, y, cx, cy;
    dot(int X = 0, int Y = 0): x(X), y(Y) {
        cx = calc(X),
        cy = calc(Y);
    }
    bool operator < (const dot &b) const {
        dot a = *this;

        if (a.x == b.x)
            return ( a.y < b.y);

        return a.x < b.x;
    }
} a[max_m];

inline bool check(dot A, dot B) {
    return ((A.x & B.x) == A.x && (A.y & B.y) == A.y);
}

int f[max_n][max_n], g[max_m];

bool End;
#define File ""
signed main() {
    // #ifndef ONLINE_JUDGE
    // freopen(File ".in","r",stdin);
    // freopen(File ".out","w",stdout);
    // #endif
    // cerr<<"Memory : "<<(&Begin-&End)/1024.0/1024<<"\n";
    
    f[0][0] = fac[0] = inv[0] = 1;

    for (register int i = 1; i <= N; ++i)
        fac[i] = fac[i - 1] * i % mod;

    inv[N] = mi(fac[N]);

    for (register int i = N - 1; i; --i)
        inv[i] = inv[i + 1] * (i + 1) % mod;

    for (register int i = 0; i <= N; ++i)
        for (register int j = 0; j <= N; ++j) {
                if(i + j)
                    f[i][j] = 0;
                for (register int p = 1; p <= i; ++p)
                    f[i][j] = (f[i][j] + f[i - p][j] * C(i, p)) % mod;

                for (register int p = 1; p <= j; ++p)
                    f[i][j] = (f[i][j] + f[i][j - p] * C(j, p)) % mod;
            }
    int t = read();
    while(t -- )
    {

        X = read(), Y = read(), n = cnt = read();

        for (register int i = 1; i <= n; ++i) {
            int x = read(), y = read();
            a[i] = dot(x, y);
        }

        sort(a + 1, a + 1 + n);
        a[++cnt] = dot(X, Y);

        for (register int i = 1; i <= cnt; ++i) {
            int sm = 0;

            for (register int j = 1; j < i; ++j)
                if (check(a[j], a[i]))
                    sm = (sm + g[j] * f[a[i].cx - a[j].cx][a[i].cy - a[j].cy]) % mod;

            g[i] = (f[a[i].cx][a[i].cy] - sm + mod) % mod;
        }

        write(g[cnt]);
        putchar('\n');
    }
    return 0;
}, In this Programming Language: C++, Now tell me if this Code is compilable or not?