传送门
分析:区间序列之和是k的倍数,首先想到暴力 10的5次会超时;如果两个区间之间的差值是k的倍数,则中间的数满足k倍区间;所以用前缀和记录一下,再遍历用乘法原理。
#include<bits/stdc++.h>
using namespace std;
long long sum,yushu[100010];
int main()
{
int n,k,x;
long long count=0;;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
sum+=x;
yushu[sum%k]++;
}
for(int i=0;i<k;i++)
count+=yushu[i]*(yushu[i]-1)/2;//可以构成k倍区间的两两组合,k的倍数的也可以两两组合
count+=yushu[0];//直接满足条件的k区间 这些是从第一个开始的,上边的是从后的开始的
printf("%lld\n",count);
}