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

 

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