牛客练习赛64 C 序列卷积之和(前缀和+贡献)

题目链接
牛客练习赛64 C 序列卷积之和(前缀和+贡献)_第1张图片
思路:暴力以后其实可以发现a【i】的贡献其实就是ia【i】(n-j+1)*a【j】,(i<=j<=n),如此一来我们只要用sum数组记录一下后面(n-j+1)*a【j】的前缀和就可以了。

#include
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int maxn=2e5+5;
ll a[maxn],sum[maxn],ans;
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;++i) scanf("%lld",&a[i]);
	for(int i=1;i<=n;++i)
	sum[i]=(sum[i-1]+a[i]*(n-i+1))%mod;
	for(int i=1;i<=n;++i)
	ans+=(i*a[i])%mod*(sum[n]-sum[i-1]+mod)%mod,ans%=mod;
	cout<<ans<<endl;
} 

你可能感兴趣的:(前缀和)