蓝桥杯 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
资源约定
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 2000ms

思路:用sum[i]表示从元素1到元素i的和,求区间[l,r]的和即为sum[r]-sum[l-1],区间[l,r]的和为k的倍数,即(sum[r]-sum[l-1])%k==0,即sum[r]%k==sum[l-1]%k

以 1 2 3 4 5为例,

前1个数和为 1,取余为1,前面前缀和取余为1的个数为0,加0

前2个数和为 3,取余为1,前面前缀和取余为1的个数为1,加1,即sum[2]%k=sum[1]%k,即区间[2,2]即2

前3个数和为 6,取余为0,前面前缀和取余为0的个数为0,加0

前4个数和为 10,取余为0,前面前缀和取余为0的个数为1,加1,即sum[4]%k=sum[3]%k,即区间[4,4]即4

前5个数和为 15,取余为1,前面前缀和取余为1的个数为2,加2,第一个序列:sum[5]%k=sum[1]%k,即区间[2,5]即2 3 4 5,

第二个序列:sum[5]%k=sum[2]%k,即区间[3,5]即3 4 5,

这样的话count=1+1+2=4,而结果为6,为什么?

因为我们忘记了sum[3],sum[4]取余都为0,sum[3]即1 2 3,sum[4]即 1 2 3 4,所以我们count要加上和取余为0的个数!,即count=4+2=6!

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		int n = s.nextInt();
		int k = s.nextInt();
		int[] num = new int[n + 1];
		int[] sum = new int[n + 1];
		int[] c = new int[100000 + 10];
		int count = 0;
		for (int i = 1; i <= n; i++) {
			num[i] = s.nextInt();
			sum[i] = sum[i - 1] + num[i];
			count += c[sum[i] % k];
			c[sum[i] % k]++;
		}
		System.out.println(count + c[0]);
	}
}

猜你喜欢

转载自blog.csdn.net/HZPHYT/article/details/88548213