思路:
数列:
前缀和:
若Si整除k,那么~
是一个k倍区间
若S_i与S_j模k同余,那么~
是一个k倍区间
用数组cnt记录s_i模k的个数
每增加一个ai,增加的k倍区间个数就为:在~
中,与
模k同余的元素个数
AC代码:
#include<iostream>
using namespace std;
int a[100005]={0};
int cnt[100005]={1};
int n,k;
long long ans=0;
int main()
{
cin>>n>>k;
for(int i=1;i<=n;++i)
{
cin>>a[i];
a[i]=(a[i]+a[i-1])%k;
}
for(int i=1;i<=n;++i)
{
ans+=cnt[a[i]%k];
cnt[a[i]%k]++;
}
cout<<ans<<endl;
return 0;
}