D - Candy Distribution
题目大意:
给出包含n个整数的数组,统计任意区间内的数之和是否能被m整除的区间的个数。
分析:
看到这题,就想到了偶数减偶数还是偶数,以致于写的时候也是这么写了,回过头看见有个m才想起是模m,也是一样的,根据同余定理,(a-b)%m=a%m-b%m,显然要用到前缀和,但是前缀和明显会超出数组的范围,所以选用map来代替前缀数组,加上与当前位置模完之后相同的个数,如果当前位置的前缀和模m为0,则再加上1,然后不断更新当前位置之前所有位置的前缀和模m之后的数的个数。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
using namespace std;
typedef long long ll;
int n,m;
ll x,sum,ans;
map<ll,int>mmp;
int main()
{
scanf("%d%d",&n,&m);
sum=0;
ans=0;
for(int i=0;i<n;i++)
{
scanf("%lld",&x);
sum+=x;
ans+=mmp[sum%m];
if(sum%m==0) ans++;
mmp[sum%m]++;
}
printf("%lld\n",ans);
return 0;
}