题目描述
给定一个长度为N的数列,A1, A2, … AN,如果其中一段连续的子序列Ai, Ai+1, … Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。
你能求出数列中总共有多少个K倍区间吗?
输入
输入数据:
第一行包含两个整数N和K。(1 <= N, K <= 100000)
以下N行每行包含一个整数Ai。(1 <= Ai <= 100000)
输出
输出数据:
输出一个整数,代表K倍区间的数目。
样例输入
5 2
1
2
3
4
5
样例输出
6
资源约定
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 2000ms
思路: 由于题目要求的是在连续的子序列的,因此可以先从区间为[i,i+1]开始从左往右进行遍历,最后到[i,i+n],见下图
上代码
public class Question_10 {
static int N;
static int K;
static int[] num ;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
N = scanner.nextInt();//数组长度
K = scanner.nextInt();//倍数
num = new int[N+1];
for (int i=1;i<N+1;i++){
num[i]=scanner.nextInt();
}
int count=0;
int a=0;
//循环N次,从区间为0到区间为N-1进行遍历判断
while (a!=N){
for (int i=1;i<N+1-a;i++){
if (check(getsum(i,a))){
count++;
}
}
a++;
}
System.out.println(count);
}
//求得区间内的和
private static int getsum(int i, int a) {
int sum=0;
for (int index=0;index<a+1;index++){
sum+=num[i];
i++;
}
return sum;
}
private static boolean check(int i) {
return i%K==0?true:false;
}
}