#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using namespace atcoder; typedef long long ll; #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define repr(i, n) for (int i = (int)(n) - 1; i >= 0; i--) #define repk(i, k, n) for (int i = k; i < (int)(n); i++) #define all(v) v.begin(), v.end() #define mod1 1000000007 #define mod2 998244353 #define mod3 100000007 #define vi vector #define vs vector #define vc vector #define vl vector #define vb vector #define vvi vector> #define vvc vector> #define vvl vector> #define vvb vector> #define vvvi vector>> #define vvvl vector>> #define pii pair #define pil pair #define pli pair #define pll pair #define vpii vector> #define vpll vector> #define vvpii vector>> #define vvpll vector>> template void debug(T e) { cerr << e << endl; } template void debug(vector &v) { rep(i, v.size()) { cerr << v[i] << " "; } cerr << endl; } template void debug(vector> &v) { rep(i, v.size()) { rep(j, v[i].size()) { cerr << v[i][j] << " "; } cerr << endl; } } template void debug(vector> &v) { rep(i, v.size()) { cerr << v[i].first << " " << v[i].second << endl; } } template void debug(set &st) { for (auto itr = st.begin(); itr != st.end(); itr++) { cerr << *itr << " "; } cerr << endl; } template void debug(multiset &ms) { for (auto itr = ms.begin(); itr != ms.end(); itr++) { cerr << *itr << " "; } cerr << endl; } template void debug(map &mp) { for (auto itr = mp.begin(); itr != mp.end(); itr++) { cerr << itr->first << " " << itr->second << endl; } } void debug_out() { cerr << endl; } template void debug_out(Head H, Tail... T) { cerr << H << " "; debug_out(T...); } using mint = modint998244353; void debug_mint1(vector &vec) { for (int i = 0; i < vec.size(); i++) { cerr << vec[i].val() << " "; } cerr << endl; } void debug_mint2(vector> &vec) { for (int i = 0; i < vec.size(); i++) { for (int j = 0; j < vec[i].size(); j++) { cerr << vec[i][j].val() << " "; } cerr << endl; } } ll my_pow(ll x, ll n, ll mod) { //  繰り返し二乗法.x^nをmodで割った余り. ll ret; if (n == 0) { ret = 1; } else if (n % 2 == 1) { ret = (x * my_pow((x * x) % mod, n / 2, mod)) % mod; } else { ret = my_pow((x * x) % mod, n / 2, mod); } return ret; } ll inv(ll x, ll mod) { return my_pow(x, mod - 2, mod); } ll garner(vector &mr, ll mod){ mr.push_back(make_pair(mod, 0)); vector coffs(mr.size(), 1); vector constants(mr.size(), 0); for (ll i = 0; i < mr.size() - 1; i++){ ll v = (mr[i].second + mr[i].first - constants[i]) * inv(coffs[i], mr[i].first); v %= mr[i].first; if (v < 0){ v += mr[i].first; } for (ll j = i + 1; j < mr.size(); j++){ constants[j] += coffs[j] * v; constants[j] %= mr[j].first; coffs[j] *= mr[i].first; coffs[j] %= mr[j].first; } } return constants[mr.size() - 1]; } vector conv_freemod(vector &a, vector &b, ll mod){ ll m1 = 998244353; ll m2 = 167772161; ll m3 = 469762049; vector c1 = convolution<998244353>(a, b); vector c2 = convolution<167772161>(a, b); vector c3 = convolution<469762049>(a, b); vector c(c1.size()); for (ll i = 0; i < c1.size(); i++){ vector p; p.push_back(make_pair(m1, c1[i])); p.push_back(make_pair(m2, c2[i])); p.push_back(make_pair(m3, c3[i])); ll g = garner(p, mod); c[i] = g; } return c; } vector fps_inv(vector &f, ll mod) { // f の mod 998244353 での fps_inv を返す ll n = f.size(); ll new_n = 1; ll log = 0; while (new_n < n) { new_n *= 2; log++; } for (ll i = n; i < new_n; i++) { f.push_back(0); } // g[0] の項 vector g = {inv(f[0], mod)}; ll now = 1; for (ll i = 0; i < log; i++) { now *= 2LL; vector fsub(now); for (ll j = 0; j < now; j++) { fsub[j] = f[j]; } vector h1 = conv_freemod(g, fsub, mod); vector h2(now, 0); h2[0] = 2; for (ll j = 0; j < now; j++) { h2[j] = (h2[j] + mod - h1[j]) % mod; } vector h3 = conv_freemod(g, h2, mod); for (ll j = 0; j < now / 2; j++) { g[j] = h3[j]; } for (ll j = now / 2; j < now; j++) { g.push_back(h3[j]); } } vector new_g(0); for (ll i = 0; i < n; i++) { new_g.push_back(g[i]); } return new_g; } int main() { ll N; cin >> N; ll K; cin >> K; vector x(K); rep(i, K){ cin >> x[i]; } vector bumbo(N + 2); bumbo[0] = 1; for (ll i = 0; i < K; i++){ if (x[i] <= N + 1){ bumbo[x[i]] = mod1 - 1; } } vector inv_vec = fps_inv(bumbo, mod1); cout << inv_vec[N] << endl; }