#include <bits/stdc++.h>
using namespace std;
const int N = 32, M = 20, mod = 998244353;
template <typename T>
void read(T &x) {
  int ch = getchar();
  x = 0;
  bool f = false;
  for (; ch < '0' || ch > '9'; ch = getchar()) f |= ch == '-';
  for (; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
  if (f) x = -x;
}
void qmo(int &x) { x += x >> 31 & mod; }
int n, m, lim, px[N], py[N], nx[N], ny[N], dp[2][2][2][M][M][M][M];
auto f = dp[0], g = dp[1];
int main() {
  read(n);
  read(m);
  lim = (1 << n) - 1;
  ******g = 1;
  for (int i = 0, x, y; i < n; ++i) {
    read(x);
    read(y);
    (x > 0 ? px : nx)[1 << i] = abs(x);
    (y > 0 ? py : ny)[1 << i] = abs(y);
  }
  for (int i = 0; i <= lim; ++i) {
    px[i] = px[i & -i] + px[i & (i - 1)];
    py[i] = py[i & -i] + py[i & (i - 1)];
    nx[i] = nx[i & -i] + nx[i & (i - 1)];
    ny[i] = ny[i & -i] + ny[i & (i - 1)];
  }
  if (!px[lim] || !py[lim] || !nx[lim] || !ny[lim]) {
    puts("0");
    return 0;
  }
  for (; m; m >>= 1) {
    int _ = m & 1, v;
    swap(f, g);
    memset(g, 0, sizeof *dp);
    for (int d0 = 0; d0 < 2; ++d0)
      for (int d1 = 0; d1 < 2; ++d1)
        for (int p0 = 0; p0 < px[lim]; ++p0)
          for (int p1 = 0; p1 < py[lim]; ++p1)
            for (int n0 = 0; n0 < nx[lim]; ++n0)
              for (int n1 = 0; n1 < ny[lim]; ++n1)
                if (v = f[d0][d1][p0][p1][n0][n1]) {
                  v -= mod;
                  for (int S = 0; S <= lim; ++S) {
                    int tp0 = p0 + px[S], tp1 = p1 + py[S], tn0 = n0 + nx[S],
                        tn1 = n1 + ny[S];
                    if (((tp0 ^ tn0) | (tp1 ^ tn1)) & 1) continue;
                    qmo(g[(tp0 ^ _) & 1 ? !_ : d0][(tp1 ^ _) & 1 ? !_ : d1]
                         [tp0 >> 1][tp1 >> 1][tn0 >> 1][tn1 >> 1] += v);
                  }
                }
  }
  int v = ******g - 1;
  qmo(v);
  printf("%d\n", v);
}
