给定一个长度为 NN 的数列,A1,A2,…ANA1,A2,…AN,如果其中一段连续的子序列 Ai,Ai+1,…AjAi,Ai+1,…Aj 之和是 KK 的倍数,我们就称这个区间 [i,j][i,j] 是 KK 倍区间。
你能求出数列中总共有多少个 KK 倍区间吗?
输入格式
第一行包含两个整数 NN 和 KK。
以下 NN 行每行包含一个整数 AiAi。
输出格式
输出一个整数,代表 KK 倍区间的数目。
数据范围
1≤N,K≤1000001≤N,K≤100000,
1≤Ai≤1000001≤Ai≤100000
输入样例:
5 2
1
2
3
4
5
输出样例:
6
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 100010;
int n, k;
LL s[N], cnt[N];
int main(){
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; i ++){
scanf("%lld", &s[i]);
s[i] += s[i - 1];
}
LL res = 0;
cnt[0] = 1;
for (int i = 1; i <= n; i ++){
if (cnt[s[i] % k]) res += cnt[s[i] % k];
cnt[s[i] % k] ++;
}
cout << res << endl;
return 0;
}