#include <iostream>
#include <algorithm>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <string.h>
#include <vector>
#include <queue>
#include <cmath>
#include <bitset>
#include <complex>
#include <functional>
#include <numeric>
#include <iomanip>

#define SPBR(w, n) std::cout<<(w + 1 == n ? '\n' : ' ');
#define YES cout << "YES" << endl
#define Yes cout << "Yes" << endl
#define NO cout << "NO" << endl
#define No cout << "No" << endl
#define ALL(i) (i).begin(), (i).end()
#define FOR(i, a, n) for(int i=(a);i<(n);++i)
#define RFOR(i, a, n) for(int i=(n)-1;i>=(a);--i)
#define REP(i, n) for(int i=0;i<int(n);++i)
#define RREP(i, n) for(int i=int(n)-1;i>=0;--i)
#define IN(a, x, b) (a<=x && x<b)
#define OUT(a, x, b) (x<a || b<=x)
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }

#define int ll
using ll = long long;
using ull = unsigned long long;
using ld = long double;
/* const int MOD = 1000000007; */
const int MOD = 998244353;
const int INF = 1e18;
const double PI = acos(-1);

using namespace std;
struct INIT { INIT(){
  cin.tie(0); ios::sync_with_stdio(false);
  cout << fixed << setprecision(10);
}}INIT;

struct mint {
  int val;
  constexpr mint(int v = 0) noexcept : val(v % MOD) {
    if (val < 0) val += MOD;
  }
  constexpr int getMOD() { return MOD; }
  constexpr mint operator - () const noexcept {
    return val ? MOD - val : 0;
  }
  constexpr mint operator + (const mint& r) const noexcept { return mint(*this) += r; }
  constexpr mint operator - (const mint& r) const noexcept { return mint(*this) -= r; }
  constexpr mint operator * (const mint& r) const noexcept { return mint(*this) *= r; }
  constexpr mint operator / (const mint& r) const noexcept { return mint(*this) /= r; }
  constexpr mint& operator += (const mint& r) noexcept {
    val += r.val;
    if (val >= MOD) val -= MOD;
    return *this;
  }
  constexpr mint& operator -= (const mint& r) noexcept {
    val -= r.val;
    if (val < 0) val += MOD;
    return *this;
  }
  constexpr mint& operator *= (const mint& r) noexcept {
    val = val * r.val % MOD;
    return *this;
  }
  constexpr mint& operator /= (const mint& r) noexcept {
    int a = r.val, b = MOD, u = 1, v = 0;
    while (b) {
      int t = a / b;
      a -= t * b; swap(a, b);
      u -= t * v; swap(u, v);
    }
    val = val * u % MOD;
    if (val < 0) val += MOD;
    return *this;
  }
  constexpr bool operator == (const mint& r) const noexcept {
    return this->val == r.val;
  }
  constexpr bool operator != (const mint& r) const noexcept {
    return this->val != r.val;
  }
  friend ostream& operator << (ostream &os, const mint& x) noexcept {
    return os << x.val;
  }
  friend istream& operator >> (istream &is, mint& x) noexcept {
    return is >> x.val;
  }
  friend constexpr mint powMod(const mint &a, int n) noexcept {
    if (n == 0) return 1;
    auto t = powMod(a, n / 2);
    t = t * t;
    if (n & 1) t = t * a;
    return t;
  }
};


template<typename Monoid, typename OperatorMonoid = Monoid>
struct LazySegmentTree{
  using F = function<Monoid(Monoid, Monoid)>;
  using G = function<Monoid(Monoid, OperatorMonoid)>;
  using H = function<OperatorMonoid(OperatorMonoid, OperatorMonoid)>;
  using P = function<OperatorMonoid(OperatorMonoid, int) >;

  int sz;
  vector<Monoid> data;
  vector<OperatorMonoid> lazy;
  const F f;
  const G g;
  const H h;
  const P p;
  const Monoid M1;
  const OperatorMonoid OM0;

  LazySegmentTree(int n, const F f, const G g, const H h, const P p,
                  const Monoid &M1, const OperatorMonoid OM0)
      : f(f), g(g), h(h), p(p), M1(M1), OM0(OM0)
  {
    sz = 1;
    while(sz < n) sz <<= 1;
    data.assign(2 * sz, M1);
    lazy.assign(2 * sz, OM0);
  }

  void set(int k, const Monoid &x){
    data[k + sz] = x;
  }

  void build(){
    for(int k = sz - 1; k > 0; k--) {
      data[k] = f(data[2 * k + 0], data[2 * k + 1]);
    }
  }

  void propagate(int k, int len){
    if(lazy[k] != OM0) {
      if(k < sz) {
        lazy[2 * k + 0] = h(lazy[2 * k + 0], lazy[k]);
        lazy[2 * k + 1] = h(lazy[2 * k + 1], lazy[k]);
      }
      data[k] = g(data[k], p(lazy[k], len));
      lazy[k] = OM0;
    }
  }

  Monoid update(int a, int b, const OperatorMonoid &x, int k, int l, int r){
    propagate(k, r - l);
    if(r <= a || b <= l) {
      return data[k];
    } else if(a <= l && r <= b) {
      lazy[k] = h(lazy[k], x);
      propagate(k, r - l);
      return data[k];
    } else {
      return data[k] = f(update(a, b, x, 2 * k + 0, l, (l + r) >> 1),
                         update(a, b, x, 2 * k + 1, (l + r) >> 1, r));
    }
  }

  Monoid update(int a, int b, const OperatorMonoid &x){
    return update(a, b, x, 1, 0, sz);
  }


  Monoid query(int a, int b, int k, int l, int r){
    propagate(k, r - l);
    if(r <= a || b <= l) {
      return M1;
    } else if(a <= l && r <= b) {
      return data[k];
    } else {
      return f(query(a, b, 2 * k + 0, l, (l + r) >> 1),
               query(a, b, 2 * k + 1, (l + r) >> 1, r));
    }
  }

  Monoid query(int a, int b){
    return query(a, b, 1, 0, sz);
  }

  Monoid operator[](const int &k){
    return query(k, k + 1);
  }
};
// 区間add 区間min
/* auto f = [](int a, int b) { return min(a, b); }; */
/* auto g = [](int a, int b) { return a + b; }; */
/* auto h = [](int a, int b) { return a + b; }; */
/* auto p = [](int a, int b) { return a; }; */
/* LazySegmentTree< int > seg(N, f, g, h, p, INT_MAX, 0); */
// 区間add 区間sum
/* auto f = [](int a, int b) { return a + b; }; */
/* auto p = [](int a, int b) { return a * b; }; */
/* LazySegmentTree< int > seg(N, f, f, f, p, 0, 0); */


signed main() {
  int N, K;
  cin >> N >> K;

  vector<int> L(K), R(K);
  REP(i, K) cin >> L[i] >> R[i];

  auto f = [](mint a, mint b) { return a + b; };
  auto p = [](mint a, mint b) { return a * b; };
  LazySegmentTree<mint> dp(N, f, f, f, p, 0, 0);

  dp.update(0, 1, 1);

  REP(i, N){
    mint now = dp[i];
    REP(j, K){
      if(i+L[j] < N){
        dp.update(i+L[j], min(N, i+R[j]+1), now);
      }
    }
  }

  cout << dp[N-1] << "\n";

  return 0;
}


Measured memory_bytes: 11392