题大意:给你n个数和一个k,问有多少个区间可以得到sum%k==0,比如(l,r),(a[l]+a[l+1]+........+a[r])%k==0
解法:
利用前缀和保存得到前缀和数组,并用一个数组记录下此时前缀和出现的次数,因为当重复出现同一个前缀和的时候代表有一段区间能够%k==0。
代码:
#include <math.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>
#include <list>
#include <deque>
#include <set>
#include <vector>
#include <map>
#define LL long long
#define max(a,b) (a>b?a:b)
using namespace std;
const int MAXN=1e6+7;
LL a[MAXN];
LL sum[MAXN]={0};
LL vis[MAXN];
int main()
{
ios::sync_with_stdio(false);
LL n,k;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
cin>>k;
int ans=0;
for(int i=1;i<=n;i++)
{
sum[i]=(a[i]+sum[i-1])%k;
}
for(int i=1;i<=n;i++)
{
ans+=vis[sum[i]];
vis[sum[i]]++;
// cout<<"sum= "<<sum[i]<<endl;
//cout<<"vis= "<<vis[sum[i]]<<endl;
}
cout<<ans<<endl;
return 0;
}