#include using namespace std; #define int long long #define stoi stoll using pii = pair; using vi = vector; using vvi = vector; using vb = vector; using vvb = vector; template using heap = priority_queue, greater>; #define all(c) begin(c), end(c) #define rall(c) rbegin(c), rend(c) #define fore(x, c) for (auto &&x : c) #define rep(i, a, n) for (int i = (int)(a), i##len = (int)(n); i < i##len; ++i) #define rrep(i, a, n) for (int i = (int)(n - 1); i >= a; --i) #define pb push_back #define eb emplace_back #define dump(...) const signed INF_ = 1001001001; const long long INF = 1001001001001001001LL; const int DX[9] = {0, 1, 0, -1, 1, 1, -1, -1, 0}, DY[9] = {-1, 0, 1, 0, -1, 1, 1, -1, 0}; template int sz(const C &c) { return (int)c.size(); } template bool contains(const C &c, const T &v) { return c.find(v) != c.end(); } template bool inseg(const T &l, const T &x, const T &r) { return l <= x && x < r; } template ostream &operator<<(ostream &os, const pair &p) { return os << p.first << " " << p.second; } template istream &operator>>(istream &is, pair &p) { return is >> p.first >> p.second; } template ostream &ostream_container_impl(ostream &os, const C &v) { if (v.empty()) return os; auto itr = begin(v), prv = prev(end(v)); while (itr != prv) os << *itr++ << " "; return os << *prv; } template ostream &operator<<(ostream &os, const vector &v) { return ostream_container_impl(os, v); } template ostream &operator<<(ostream &os, const deque &v) { return ostream_container_impl(os, v); } template ostream &operator<<(ostream &os, const set &v) { return ostream_container_impl(os, v); } template istream &operator>>(istream &is, vector &v) { for (auto &x : v) is >> x; return is; } template bool chmax(T &a, const U &b) { return a < b ? a = b, 1 : 0; } template bool chmin(T &a, const U &b) { return a > b ? a = b, 1 : 0; } template void psum(T &c) { partial_sum(begin(c), end(c), begin(c)); } template void decrement(T &x) { x -= 1; } template void decrement(pair &p) { decrement(p.first); decrement(p.second); } template void decrement(vector &v) { for (auto &x : v) decrement(x); } template void increment(T &x) { x += 1; } template void incrment(pair &p) { increment(p.first); increment(p.second); } template void increment(vector &v) { for (auto &x : v) increment(x); } #if defined(LOCAL) void dump_impl(string s) { assert(s.empty()); } template void dump_impl(string s, const H &head, const T &...tail) { int par = 0; rep(i, 0, sz(s)) { char ch = s[i]; if (ch == ',' && par == 0) { cerr << " = " << head << ","; dump_impl(s.substr(i + 1), tail...); return; } else { cerr << ch; if (ch == '(') par++; if (ch == ')') par--; } } } #ifdef dump #undef dump #endif #define dump(...) \ do { \ cerr << "\x1b[33;1m"; \ dump_impl(#__VA_ARGS__ ",", __VA_ARGS__); \ cerr << "\x1b[0m" << endl; \ } while (0) #endif struct before_main_function { before_main_function() { #if defined(LOCAL) && defined(int) cerr << "\x1b[7m" << "'int' is 'long long'" << "\x1b[m" << endl; #endif cin.tie(nullptr); ios::sync_with_stdio(false); cout << setprecision(15) << fixed; } } before_main_function; //------------------8<------------------------------------8<-------------------- template class ModInt { public: ModInt() : v(0) {} ModInt(int x) : v((x + mod) % mod) {} int value() const { return v; } const ModInt operator+(const ModInt &r) const { return ModInt(this->v + r.v); } const ModInt operator-(const ModInt &r) const { return ModInt(this->v + mod - r.v); } const ModInt operator*(const ModInt &r) const { return ModInt(this->v * r.v); } const ModInt operator/(const ModInt &r) const { return (*this * (~r)); } const ModInt operator^(int k) const { return ModInt(bpow(this->v, k)); } const ModInt operator~() const { return ModInt(bpow(this->v, mod - 2)); } bool operator==(const ModInt &r) const { return this->v == r.v; } bool operator!=(const ModInt &r) const { return this->v != r.v; } ModInt &operator+=(const ModInt &r) { return *this = *this + r; } ModInt &operator-=(const ModInt &r) { return *this = *this - r; } ModInt &operator*=(const ModInt &r) { return *this = *this * r; } ModInt &operator/=(const ModInt &r) { return *this = *this * (~r); } private: int v; int bpow(int a, int b) const { int ret = 1; while (b > 0) { if (b & 1) ret = (ret * a) % mod; a = (a * a) % mod; b >>= 1; } return ret; } }; using Mint = ModInt<1000000007>; using Mvi = vector; using Mvvi = vector>; struct Factorial { static constexpr int MAX_N = 2000006; vector fact, fact_inv; Factorial(size_t size = MAX_N) : fact(size), fact_inv(size) { fact[0] = fact_inv[0] = 1; for (int i = 1; i < MAX_N; ++i) { fact[i] = fact[i - 1] * i; fact_inv[i] = ~fact[i]; } } Mint combination(int N, int R) { if (N < R) return 0; return fact[N] * fact_inv[N - R] * fact_inv[R]; } static Mint bin_pow(Mint x, int p) { if (x.value() == 0) return x; Mint prod = 1; while (p > 0) { if (p & 1) prod *= x; x *= x; p >>= 1; } return prod; } } fact; signed main() { int N, M; cin >> N >> M; vi A(N); rep(i, 1, N) cin >> A[i]; M--; Mint ans = 0; Mint S = 0; int t = 0; Mint c = 1; rrep(i, 1, N) { c *= Mint(M + t); c /= Mint(t + 1); S += c; t += 1; ans += (S + 1) * Mint(A[i]); } cout << ans.value() << endl; }