#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); } vector fps_inv(vector &f) { // 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], mod2)}; 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 = convolution(g, fsub); vector h2(now, 0); h2[0] = 2; for (ll j = 0; j < now; j++) { h2[j] = (h2[j] + mod2 - h1[j]) % mod2; } vector h3 = convolution(g, h2); 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; } vector convolution_naive(vector &a, vector &b){ ll len_a = a.size(); ll len_b = b.size(); vector c(len_a + len_b - 1); for (ll i = 0; i < len_a; i++){ for (ll j = 0; j < len_b; j++){ c[i + j] += a[i] * b[j]; c[i + j] %= mod1; } } return c; } ll bostan_mori(vector &p, vector &q, ll n) { // bostan_mori 法を mod 998244353 で ll len_p = p.size(); ll len_q = q.size(); if (n == 0) { return (p[0] * inv(q[0], mod1)) % mod1; } vector q_minus(len_q); for (ll i = 0; i < len_q; i++) { if (i % 2 == 0) { q_minus[i] = q[i]; } else { q_minus[i] = (mod1 - q[i]) % mod1; } } vector conv_p = convolution_naive(p, q_minus); vector conv_q = convolution_naive(q, q_minus); vector s(len_p); vector t(len_q); for (ll i = 0; i < len_q; i++) { t[i] = conv_q[i * 2]; } if (n % 2 == 0) { for (ll i = 0; i < len_p; i++) { s[i] = conv_p[i * 2]; } } else { for (ll i = 0; i < len_p; i++) { s[i] = conv_p[i * 2 + 1]; } } return bostan_mori(s, t, n / 2); } int main() { ll n, c; cin >> n >> c; vector a(n); for (ll i = 0; i < n; i++){ cin >> a[i]; } queue> que; for (ll i = 0; i < n; i++){ que.push({1, (mod1 - a[i]) % mod1}); } for (ll i = 0; i < n - 1; i++){ vector v1 = que.front(); que.pop(); vector v2 = que.front(); que.pop(); vector v3 = convolution_naive(v1, v2); que.push(v3); } vector v = que.front(); // debug(v); ll ans = 0; for (ll i = 0; i < n; i++){ ans += (mod1 - my_pow(a[i], c, mod1)); ans %= mod1; } vector v4(n, 0); v4[0] = 1; ans += bostan_mori(v4, v, c); ans %= mod1; cout << ans << endl; }