#include <bits/stdc++.h>   using namespace std;   const int mod = 998244353;   int n, m;   int f[2][25][25][25][25][2][2];   int x[6], y[6];   int tpx[1 << 6], tqx[1 << 6], tpy[1 << 6], tqy[1 << 6];   inline void update(int &x, int y) { x = x + y >= mod ? x + y - mod : x + y; }   inline bool check(int now, int px, int qx, int py, int qy) {     for (int a = 0; a < 2; a++)       for (int b = 0; b < 2; b++)         if (f[now][px][qx][py][qy]) return true;     return false;   }   int main() {     scanf( %d %d , &n, &m);     for (int i = 1; i <= n; i++) scanf( %d %d , &x[i], &y[i]);     for (int s = 0; s < (1 << n); s++)       for (int j = 1; j <= n; j++)         if (s >> j - 1 & 1) {           if (x[j] > 0)             tpx[s] += x[j];           else             tqx[s] -= x[j];           if (y[j] > 0)             tpy[s] += y[j];           else             tqy[s] -= y[j];         }     int now = 0, lim = (1 << n) - 1;     f[now][0][0][0][0][1][1] = 1;     for (int i = 31; i >= 1; i--) {       now ^= 1;       memset(f[now], 0, sizeof(f[now]));       int v = m >> i - 1 & 1;       for (int px = 0; px <= tpx[lim]; px++)         for (int qx = 0; qx <= tqx[lim]; qx++)           for (int py = 0; py <= tpy[lim]; py++)             for (int qy = 0; qy <= tqy[lim]; qy++) {               if (!check(now ^ 1, px, qx, py, qy)) continue;               for (int s = 0; s <= lim; s++)                 for (int a = 0; a < 2; a++)                   for (int b = 0; b < 2; b++) {                     int res = f[now ^ 1][px][qx][py][qy][a][b], na, nb;                     if (!res) continue;                     int npx = px * 2 - tpx[s], nqx = qx * 2 - tqx[s],                         npy = py * 2 - tpy[s], nqy = qy * 2 - tqy[s];                     if (npx > tpx[lim] || nqx > tqx[lim] || npy > tpy[lim] ||                         nqy > tqy[lim])                       continue;                     if (npx >= 0 && nqx >= 0 && npy >= 0 && nqy >= 0) {                       na = a & (v == 0), nb = b & (v == 0);                       update(f[now][npx][nqx][npy][nqy][na][nb], res);                     }                     bool f1 = a & (v == 0), f2 = b & (v == 0);                     if (!f1 && npx + 1 >= 0 && nqx + 1 >= 0 && npy >= 0 &&                         nqy >= 0) {                       na = a & (v == 1), nb = b & (v == 0);                       update(f[now][npx + 1][nqx + 1][npy][nqy][na][nb], res);                     }                     if (!f2 && npx >= 0 && nqx >= 0 && npy + 1 >= 0 &&                         nqy + 1 >= 0) {                       na = a & (v == 0), nb = b & (v == 1);                       update(f[now][npx][nqx][npy + 1][nqy + 1][na][nb], res);                     }                     if (!f1 && !f2 && npx + 1 >= 0 && nqx + 1 >= 0 &&                         npy + 1 >= 0 && nqy + 1 >= 0) {                       na = a & (v == 1), nb = b & (v == 1);                       update(f[now][npx + 1][nqx + 1][npy + 1][nqy + 1][na][nb],                              res);                     }                   }             }     }     int ans = mod - 1;     for (int a = 0; a < 2; a++)       for (int b = 0; b < 2; b++) update(ans, f[now][0][0][0][0][a][b]);     printf( %d n , ans);     return 0;   }