#!/usr/bin/env python3
# coding:utf-8

def main():
    n, k = map(int, input().split())
    lrs = []
    for i in range(k):
        l, r = input().split()
        lrs.append([int(l), int(r)])
    stdOut = solve(n, k, lrs)
    print(stdOut)


"""
方針
和集合の要素の和がn-1と等しくなる組み合わせを考える
和集合の要素の個数の最大はn-1なので、単純に総当たりで行うとO(n^n)

"""

mod = 998244353


def solve(n, k, lrs):
    # 和集合Sの作成
    S = []
    for i in range(k):
        lr = lrs[i]
        l = lr[0]
        r = lr[1]
        for j in range(r - l + 1):
            S.append(l + j)
    S.sort()

    # 例(998244353, [1, 3, 4], 4, 3) => 4 (1111,13,31,4)
    # この世に出ている部分和数え上げ問題は重複組み合わせになるため、
    # 部分和数え上げ問題はそのまま使うことはできない
    N = len(S)
    dp = [0 for i in range(n * 2)]
    dp[0] = 1
    # 配るDP
    for i in range(n):
        for si in S:
            dp[i + si] += dp[i]
        dp[i] = dp[i] % mod
    return dp[n - 1]
    # ただしこれではTLEになるので残念ならACにはなりませんでした


if __name__ == "__main__":
    main()
