#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
int a[N];
long long s[N];
long long res;
long long cnt[N];
int main(){//核心思想是当两个对k取余之后得到的余数相等的时候他们的差一定是k的倍数
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
s[i] = s[i-1]+a[i];
res+=cnt[s[i]%k];//余数相同的可以多组合出来x个,这x个是之前cnt[s[i]%k]的数量
cnt[s[i]%k]++;//更新组合数
}
cout<<res+cnt[0];//余数是0本身就是一个区间(0~i),不需要等待又一个余数是0的区间和它组合成(i~j)
return 0;
}
k倍区间(蓝桥杯)
最新推荐文章于 2024-06-12 10:00:23 发布