#include <bits/stdc++.h>
#define endl '\n'
typedef long long ll;
using namespace std;
//数据结构在这里定义
const int N =1e6+10;
int a[N];
ll sum[N];//求和要ll
int cnt[N];//收集余数为i的 sum区间个数
void solve(){
int n,k;
cin >> n >> k;
for(int i = 1; i <= n; i++){
cin >> a[i];
//初始化前缀和
sum[i] = sum[i-1] + a[i];
}
ll res = 0;
//余数为0的区间,哪怕只有一个,也能组成一个K倍区间
//只有它初始值为1
cnt[0] = 1;
for(int i = 1; i <= n; i++){
cnt[sum[i] % k]++;
//记录下 余数为 x 的 sum前缀和区间有多少
}
//收集每个余数的情况
for(int i = 0; i < k;i++){
//cnt[0]=1 保证了只有一个区间余数为0时
//让cnt[0]=2 res能正确的 + 1
//如果没有余数为0的区间 res + 0
res += cnt[i] * (cnt[i] - 1) / 2;
//如果有n个区间余数都是m,从中任取两个做差
//[i,j]这个区间的余数变成0即是k倍区间 C n 2
}
cout << res << endl;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;//多组数据要cin
//cin >> t;
t = 1;
while(t--){
solve();
}
return 0;//必须加return 0
}
0 回复
0 转发
2 喜欢
6 阅读



