美丽度(找规律)
Problem Description街道上依次坐落着n个景点,每个景点都有一个美丽度a[i]。
定义[l,r]之间景点的美丽度为(r-l+1)a[l]+(r-l)a[l+1]+…+2a[r-1]+1a[r]
现在我们想要知道对于所有的子区间,景点的美丽度和为多少。
Input第一行输入一个整数n(1<n<=1000000),
第二行输入n个整数。
0<=ai<=1e9
Output输出所有区间的美丽度和(由于输出结果太大,答案取模1e9+7)。
Sample Input
3
1 2 3
5
1 2 3 4 5
Sample Output
27
182
找规律,ai的系数为 i*(2+n-i)(1+n-i)/2
取模取模取模取模!!!!!!!!!!!!!
不要忘了对最终数据再取一次模!!!!!!!!!!!!!
感觉下面的代码应该没问题了
#include <bits/stdc++.h>
using namespace std;
long long N=1e9+7;
int main()
{
long long t,n,m,y,i,a,b,sum;
while(scanf("%lld",&n)!=EOF)
{
sum=0;
for(i=1; i<=n; i++)
{
m=1;
scanf("%lld",&a);
m=i%N;
m*=a%N;
m*=(2+n-i)%N;
m*=(1+n-i)%N;
m/=2;
sum+=m;
sum%=N;
}
cout<<sum%N<<'\n';
}
return 0;
}