现在给你一组序列a,那么给出如何求s3,那么我们要求出S4的多少即ai*s3那么我们根据公式计算即可,但是要注意/6的时候要求逆元,因为是取模的关系。
#include <bits/stdc++.h>
#define maxs 220200
#define mme(i,j) memset(i,j,sizeof(i))
using namespace std;
#define ll long long
const long long mod =1e9+7;
long long mul1[maxs],mul2[maxs],mul3[maxs];
long long a[maxs];
long long quick(ll a,ll b)
{
ll ans = 1;
while(b)
{
if(b&1)
ans = (ans*a)%mod;
a = (a*a)%mod;
b >>= 1;
}
return ans;
}
long long resu(int x){
long long ans = 0;
long long a1 = ( ( mul1[x] * mul1[x]) %mod*mul1[x]) %mod;
long long a2 = ( ( ( mul2[x] * mul1[x] ) %mod ) * 3) %mod;
long long a3 = (2* mul3[x])%mod;
ans = a1-a2+a3;
ans = ( ans * quick(6,mod-2) )%mod;
return ans%mod;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
mul1[0]=mul2[0]=mul3[0]=0;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
mul1[i]=( mul1[i-1] + a[i])%mod;
mul2[i]=( mul2[i-1] + (a[i]*a[i])%mod)%mod;
mul3[i]=( mul3[i-1] + ( (a[i]*a[i])%mod * a[i])%mod ) %mod ;
}
long long sum=0;
for(int i=4;i<=n;i++)
sum=sum + (a[i]*resu(i-1)%mod) % mod;
cout<<sum%mod<<endl;
}
return 0;
}