先观察题目所给出的数据;10^6个数据;
显然可知O( n ^ 2 )也会超时;
先根据题解写出3重暴力算法用于验证;
通过一定的推算;可以看出i和j确定时,j + 1~ n每一项的和均需要成上num[ i ] * num[ j ]求和就为题解,可优化至O(n ^ 2 ),通过预处理前m项的和,减少一次for循环;
再进行优化;最简单的优化方式,同理,优化成分段求和相乘,即仿照O(n ^ 2 )优化方法,可发现确定i和j的断点,分成相应的三段,同理区间求和相乘即可,最终可优化至O( n );
证明:
例如:给定n个数据,分别为num[ 0 ], num[ 1 ], .............num[ n ];
可以发现
t1 = num[ i ] * ( num[ i - 1 ] * ( num[ i - 2 ] + num[ i - 3 ] + ...... + num[ 2 ] + num[ 1 ] ) + num[ i - 2 ] * ( num[ i - 3 ] + num[ 4 ] + ..... + num[ 2 ] + num[ 1 ] ) +.......... + num[ 2 ] * num[ 1 ] );
t2 = num[ i - 1 ] * ( num[ i - 2 ] * ( num[ i - 3 ] + ........+num[ 2 ] + num[ 1 ] ) + num[ i - 3 ] * ( num[ i - 4 ] +num[ i - 5 ] + ..... +num[ 2 ] + num[ 1 ] ) + .........+num[ 2 ] * num[ 1 ] );
。
。
。
。
。
t( n - 2 )= num[ 3 ] * ( num[ 2 ] * num[ 1 ] );
sum = t1 + .......+ t( n - 2 );
// Sum of product.cpp : ??????????????
//
//#include "stdafx.h"
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1000005;
typedef long long LL;
#define Mod 1000000007
LL num[ maxn ], sum[ maxn ], dp[ maxn ];
//int _tmain(int argc, _TCHAR* argv[])
int main()
{
int n;
while( scanf( "%lld", &n ) != EOF ){
memset( sum, 0, sizeof( sum ) );
for( int i = 1; i <= n; ++i ){
///cin >> num[ i ];
scanf( "%lld", &num[ i ] );
sum[ i ] = ( sum[ i - 1 ] + num[ i ] ) % Mod;
if( i > 2 ){
dp[ i ] = ( ( num[ i - 1 ] * sum[ i - 2 ] ) % Mod + dp[ i - 1 ] % Mod ) % Mod;
}
}
LL ans = 0;
for( int i = n; i > 2; --i ){
ans += ( dp[ i ] * num[ i ] ) % Mod;
}
//cout << 6 * ans << endl;
printf( "%lld\n", ( 6 * ans) % Mod );
}
return 0;
}