给定一个长度为 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
思路: cnt数组统计前边余数为x的前缀和共有多少个,当再次遇到前缀和余数为x时,相减即可得到前缀和为0,即为一个K倍区间
import java.util.*;
public class Main{
static int []cnt = new int [100005];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
cnt[0] = 1;
long ans = 0;
int sum = 0;
for(int i = 1;i <= n;i ++) {
int num = sc.nextInt();
sum = (sum + num) % k;
ans += cnt[sum];
cnt[sum] ++;
}
System.out.println(ans);
}
}