1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| #include <bits/stdc++.h> #define int long long using namespace std;
const int N = 1e6 + 666, mod = 1e9 + 7;
int n, sum1, sum2, res; int a[N], sum[N], fac[N];
inline int ksm(int a, int b) { int ret(1); for (; b; b >>= 1) { if (b & 1) ret = ret * a % mod; a = a * a % mod; } return ret; }
inline void pres_dou() { fac[0] = 1; for (int i = 1; i <= n; ++ i) fac[i] = fac[i - 1] * i % mod; return; }
inline int C(int x, int y) { if (x < y) return 0; if (x == y || y == 0) return 1; return fac[x] * ksm(fac[y] * fac[x - y] % mod, mod - 2) % mod; }
inline int ifac(int x) { if (x == 1) return 1; return ksm(x, mod - 2) % mod; }
signed main() { int i, x, y; n = read(); for (i = 1; i <= n; ++ i) { a[i] = read(); sum[i] = ( sum[i - 1] + a[i]) % mod; }
for (i = 1; i <= n; ++ i) { (sum1 += a[i] * a[i] % mod) %= mod, (sum2 += 2 * a[i] * ((sum[n] - sum[i]) % mod + mod) % mod) %= mod; }
pres_dou();
for (i = 2; i <= n; ++ i) {
x = ifac(i), y = ifac(i * i % mod);
res += ((sum1 * C(n - 1, i - 1) % mod * x - (sum1 * C(n - 1, i - 1) % mod + sum2 * C(n - 2, i - 2) % mod) * y + mod) % mod + mod) % mod;
res = res % mod; } put(res % mod); return 0; }
|