int n, m; int p[kMaxN * 2], pw[kMaxN * 2], f[kMaxN][kMaxN * 2], g[kMaxN][kMaxN * 2], h[kMaxN][kMaxN * 2], s[kMaxN][kMaxN * 2]; int pre[kMaxN * 2], suf[kMaxN * 2];
constexprintqpow(int bs, int64_t idx = kMod - 2){ int ret = 1; for (; idx; idx >>= 1, bs = (int64_t)bs * bs % kMod) if (idx & 1) ret = (int64_t)ret * bs % kMod; return ret; }
inlineintadd(int x, int y){ return (x + y >= kMod ? x + y - kMod : x + y); } inlineintsub(int x, int y){ return (x >= y ? x - y : x - y + kMod); } inlinevoidinc(int &x, int y){ (x += y) >= kMod ? x -= kMod : x; } inlinevoiddec(int &x, int y){ (x -= y) < 0 ? x += kMod : x; }
voiddickdreamer(){ std::cin >> n >> m; int sum = 0; for (int i = 1; i <= m; ++i) { std::cin >> p[i]; inc(sum, p[i]); } sum = qpow(sum); for (int i = 1; i <= m; ++i) p[i] = 1ll * p[i] * sum % kMod; pw[0] = 1; for (int i = 1; i <= n + m + 1; ++i) pw[i] = add(pw[i - 1], pw[i - 1]); // get h, s for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n + m; ++j) { h[i][j] = add(p[j], 1ll * h[i][j - 1] * h[i - 1][j - 1] % kMod); s[i][j] = add(1ll * h[i][j - 1] * s[i - 1][j - 1] % kMod, add(1ll * h[i - 1][j - 1] * s[i][j - 1] % kMod, 1ll * h[i][j - 1] * h[i - 1][j - 1] % kMod * pw[j - 1] % kMod)); } } // get f, g for (int i = 1; i <= n; ++i) { for (int j = 0; j <= n + m; ++j) { if (j) pre[j] = pre[j - 1]; else pre[j] = 0; inc(pre[j], g[i - 1][j]); } for (int j = n + m; ~j; --j) { suf[j] = add(suf[j + 1], 1ll * p[j] * f[i - 1][j] % kMod); f[i][j] = add((j ? pre[j - 1] : (int)0), suf[j + 1]); g[i][j] = 1ll * h[i][j] * f[i][j] % kMod; inc(f[i][j], add(1ll * h[i - 1][j] * add(pw[j], f[i][j + 1]) % kMod, s[i - 1][j])); inc(g[i][j], 1ll * s[i][j] * sub(1, h[i - 1][j]) % kMod); } } int ans = 0; for (int i = 1; i <= m; ++i) inc(ans, 1ll * f[n][i] * p[i] % kMod); std::cout << ans << '\n'; }