题目描述
给定长度为 的数组,求有多少个区间满足区间和是给定数 的倍数
既然要是 的倍数,也就是 之后的结果应该是 。
表示 后的前缀和,如果当前 的值出现了多次说明之前也存在区间和在 是当前这个 值。
这就意味着有两个从数组开头开始的区间他们的区间和再 之后结果一样,与之对应的就是出现了一个区间满足了题意。
举个栗子。
这个区间的区间和在 之后的结果为 ,
这个区间的区间和 之后的结果也是 ,
说明区间 这个区间的区间和在 之后的结果就为 了,就满足题意。
于是我们只需要求出每次的 ,并且记录之前 出现的次数即可。
#include <bits/stdc++.h>
#define LL long long
using namespace std;
map<LL,LL>Map;
LL N,M,Sum,Ans;
int main(){
LL I,J,K;
scanf("%lld%lld",&N,&M);
Map[0]++;
for(I=1;I<=N;I++){
LL Num;
scanf("%lld",&Num);
Sum=(Num+Sum)%M;Ans+=Map[Sum]++;
}
printf("%lld",Ans);
return 0;
}