思路:前缀和,每次都需要找在模k的意义下,前面前缀和与当前前缀和相等的个数
res[0]初始为1的意义是:sum[r]-sum[l-1] 由于l取值1-r 所以l-1 取值0 - r-1 ,
所以 sum[b]-sum[a] 时 每次需要找在模k的意义下0- b-1 与当前相等的,由于计算
的时候是从sum[1]开始的,所以sum[0]也需要先添加进去。
#include<iostream>
using namespace std;
const int N = 100010;
int a[N];
int sum[N];
int n,k;
int res[N];
int main()
{
cin>>n>>k;
long long ans = 0;
res[0]=1;
for(int i=1;i<=n;++i)
{
cin>>a[i];
sum[i]=sum[i-1]+a[i];
sum[i]%=k;
ans += res[sum[i]];
res[sum[i]]++;
}
cout<<ans<<endl;
return 0;
}