文章目录
- 前缀和的定义
- 前缀和的计算
- 前缀和的应用
前缀和的定义
前缀和指从第一个数到第i个数区间的和。
定义一个序列数组 a[ ] 和一个前缀和数s[ ],s[i]=a[1]+a[2]……+a[i]
前缀和的计算
直接上代码
#include<iostream>
using namespace std;
int main(){
int n,t,s[100];
s[0]=0;//注意初始化为0
cin>>n;
for(int i=1;i<=n;i++){
cin>>t;
s[i]=s[i-1]+t;//前缀和的计算
}
return 0;
}
前缀和的应用
- 计算某个区间的和
计算 [l,m] 区间的和,s[l]=a[1]+a[2]+……+a[l],s[m]=a[1]+a[2]+……+a[m], [l,m] 区间和为:s[m]-s[l-1] - 减少时间复杂度
洛谷p8649
#include<iostream>
using namespace std;
int main(){
int n,k;
long long temp=0,ans=0,ms[100010]={1};
cin>>n>>k;
for(int i=1,t;i<=n;i++){
cin>>t;
temp=temp+t;//计算前缀和
ms[temp%k]++;//相同模数累加
}
/*同余定理:a%k=m,b%k=m,|a-b|%k=0;x个模数相同,就有x(x-1)/2个区间是k的倍数,
组合,从x个选2个,ms[]初始化为1,才能利用组合公式计算,得到x(x-1)/2 */
for(int i=0;i<k;i++){//余数从0到k-1开始遍历
ans+=ms[i]*(ms[i]-1)/2;
}
cout<<ans;
return 0;
}