一.前缀和的概念
对于一个给定的数组A,它的前缀和数组S中 S[i] 表示从第1个元素到第 i 个元素的总和。
前缀和作用:在O(1)的时间求出数组任意区间的区间和。
二.算法模板
1.一维数组前缀和模版
int n=scan.nextInt();
int []a=new int [100005];
for(int i=1;i<=n;i++)
a[i]=scan.nextInt();//赋值
for(int i=1;i<=j;i++)
{
s[i]=s[i-1]+a[j];
}
2.二维数组前缀和模版
int n=10;
int [][]arr=new int [n+1][n+1];
long [][]sum=new long[n+1][n+1];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
sum[i][j]=sum[i-1][j]+sum[i][j-1]+arr[i-1][j-1]-sum[i-1][j-1];
}
}
三.例题
1.区间次方和
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int n=scan.nextInt();
int m=scan.nextInt();
int []a=new int [100005];
for(int i=1;i<=n;i++)
a[i]=scan.nextInt();
long [][]sum=new long[6][n+1];
long mod=(long) (1e9+7);
for(int i=1;i<=5;i++)
{
for(int j=1;j<=n;j++)
{
sum[i][j]=(long)(sum[i][j-1]+Math.pow(a[j],i));
sum[i][j]%=mod;
}
}
int l,r,k;
for(int i=1;i<=m;i++)
{
l=scan.nextInt();
r=scan.nextInt();
k=scan.nextInt();
long ans=sum[k][r]+mod-sum[k][l-1];
//一开始没写"+mod"这步,加上以后才通过的,大概是为了防止相减变成负数?
ans%=mod;
System.out.println(ans);
}
scan.close();
}