一定要记录一下这道题。
虽然自己找的规律比较复杂但起码是对的。
结果因为n*(n+1)会爆Int自闭了一下午。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
const ll mod=1e9+7;
const int N=2e5+100;
ll sum[N],sum1[N],sum2[N];
ll s[N];
ll fact[N],infact[N],iv[N];
ll ksm(ll a,ll b)
{
ll res=1;
a%=mod;
while(b)
{
if(b&1)
{
res=res*a%mod;
}
a=a*a%mod;
b>>=1;
}
return res;
}
void init()
{
fact[0]=infact[0]=1;
iv[0]=1;
for(int i=1;i<N;i++)
{
iv[i]=ksm(i,mod-2);
fact[i]=fact[i-1]*i%mod;
}
infact[N-1]=ksm(fact[N-1],mod-2);
for(int i=N-2;i>=1;i--)
{
infact[i]=infact[i+1]*(i+1)%mod;
}
}
int main()
{
int t;
init();
scanf("%d",&t);
while(t--)
{
ll n;
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&s[i]);
sum[i]=(sum[i-1]+s[i])%mod;
sum1[i]=(sum1[i-1]+s[i]*i%mod)%mod;
}
sum2[n+1]=0;
for(int i=n;i>=1;i--)
{
sum2[i]=(sum2[i+1]+s[i]*(n-i+1)%mod)%mod;
}
ll ans=sum[n]%mod*fact[n]%mod;
for(ll i=2;i<n;i++)
{
int num=min(n-i+1,i);
if(n>num*2)
{
ans+=(sum1[num]+sum2[n-num+1]+(sum[n-num]-sum[num])*num%mod)%mod*fact[n]%mod*iv[i]%mod;
ans%=mod;
}
else
{
int id=n/2;
ans+=(sum1[id]+sum2[id+1])%mod*fact[n]%mod*iv[i]%mod;
ans%=mod;
}
}
if(n!=1) ans=(ans+sum[n]%mod*fact[n]%mod*iv[n]%mod)%mod;
ans=ans*infact[n]%mod*ksm(n*(n+1)/2,mod-2)%mod;
printf("%lld\n",(ans%mod+mod)%mod);
}
}