求前缀和 直接取余 每个余数相同的可以组成一对两两相互组合 删去重复的
详情见传送门
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
//long long dp[N];
long long s[N];
int main()
{
int i,j,k,m,n;
long long ans=0;
scanf("%d%d",&n,&k);
for(i=1; i<=n; i++)
{
scanf("%d",&m);
ans+=m;
s[ans%k]++;
}
long long sum=0;
for(i=0;i<k;i++)
{
sum=sum+s[i]*(s[i]-1)/2;
}
sum+=s[0];
printf("%lld\n",sum);
return 0;
}