1. 程式人生 > 實用技巧 >Road To The 3rd Building

Road To The 3rd Building

#include<bits/stdc++.h>
using namespace std;
const int N = 4e5 + 7;
typedef long long LL;
const int MOD = 1e9 + 7;
LL iv[N], sum[N], a[N];
inline LL read() {
    LL val = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-') f = -1;
        ch = getchar();
    }
    
while (ch >= '0' && ch <= '9') { val = val * 10 + ch - '0'; ch = getchar(); } return val * f; } inline void prints(LL val) { if (val < 0) { putchar('-'); val = -val; } if (val > 9) prints(val / 10); putchar(val % 10 + '0'); } inline
void print(LL val, bool t=true) { prints(val); if (t) putchar('\n'); else putchar(' '); } void init () { iv[1] = 1; for (int i = 2; i < N; i++) { iv[i] = (MOD - MOD / i) * iv[MOD % i] % MOD; } } void solve() { int n = read(); LL ret = 0, sub = 0; for (int i = 1
; i <= n; i++) a[i] = read(); for (int i = 1; i <= n; i++) sum[i] = (sum[i - 1] + a[i]) % MOD; for (int i = 1; i <= n; i++) { ret = (ret + (sum[n] * i - sub) % MOD * iv[i] % MOD + MOD) % MOD; sub = (sub + sum[i] + sum[n] - sum[n - i] + MOD) % MOD; } ret = (ret * iv[n] % MOD * iv[n + 1] % MOD * 2) % MOD; print(ret); } int main() { init(); int T = read(); while (T--) solve(); return 0; }