k倍区间(蓝桥杯)

给定一个长度为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

解析:本题中连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,这个连续的子序列也包括自己本身,比如第一个数是1,1自己本身也是一个区间,每次向下累加又是一个区间,每个区间的和判断一下是不是k的倍数即可。

代码如下:

import java.util.Scanner;

public class k倍空间
{
	private static int n = 0;
	private static int k = 0;
	private static int[] a;
	private static int cnt = 0;  //计数
	
	public static int Method(int y,int s)  //区间累加和
	{
		s = s + a[y];  //y位置之前的区间和加上y位置的和
		return s;
	}

	public static void main(String[] args)
	{
		Scanner in = new Scanner(System.in);
		n = in.nextInt();
		k = in.nextInt();
		a = new int[n];
		for(int i=0;i<n;++i)
		{
			a[i] = in.nextInt();
		}
		int t = 0;
		for(int i=0;i<n;++i)
		{
			int s = a[i];   //自己本身也可以看作一个区间
			if(s%k==0)  //判断是否符合条件
			{
				cnt++;
			}
			for(int j=i+1;j<n;++j)  //向下累加
			{
				s = Method(j,s);  //s代表的是每次的区间和
				if(s%k==0)   //判断是否符合条件
				{
					cnt++;
				}
			}
		}
		System.out.println(cnt);
	}
}

运行结果:

输入:

5 2
5
6
3
4
8

输出:

7

输入:

5 2
1
2
3
4
5

输出:

6

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章