维护前缀和
假设有一段前缀和i~j
sum[j]-sum[i-1] mod k=0
显然
sum[i-1] mod k=sum[j] mod k
这样在读入的时候我们可以统计mod k余数为r的个数。
在余数相同的数中,任意两个匹配都可以。ans+=n*(n-1)/2 n为余数为r的数的个数。
注意特殊情况!
#include
#define MOD 1234567
int f[100000];
int main()
{
int x,n,k;
long long ans=0,sum=0;
scanf("%d %d",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
sum+=x;
f[sum%k]++;
}
ans=f[0];
for(int i=0;i<=k;i++)
ans=(ans+(f[i]*(f[i]-1))/2)%MOD;
printf("%d",ans);
while(1);
return 0;
}