BestCoder Round #85 hdoj5776 sum

本文介绍了一种算法来判断一个整数序列中是否存在连续子序列,其和能被特定整数m整除。通过预处理前缀和并运用抽屉原理,文章提供了一个高效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem Description

Given a sequence, you're asked whether there exists a consecutive subsequence whose sum is divisible by m. output YES, otherwise output NO

Input

The first line of the input has an integer T (1 \leq T \leq 101T10), which represents the number of test cases. For each test case, there are two lines: 1.The first line contains two positive integers n, m (1 \leq n \leq 1000001n1000001 \leq m \leq 50001m5000). 2.The second line contains n positive integers x (1 \leq x \leq 1001x100) according to the sequence.

Output

Output T lines, each line print a YES or NO.

Sample Input
2
3 3
1 2 3
5 7
6 6 6 6 6
Sample Output
YES
NO
思路:先预处理前缀和,就是把前1项的和,前两项的和.....存到一个数组中,然后让这个数组中的每一个元素对m取余,如果这个取余的结果出现了两次,那么就输出YES.利用抽屉原理,如果n大于m,则输出YES
代码如下:
#include<cstdio>
#include<cstring>
int sum[100010];
int a[100010];
int book[5050];
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n,m,i,flag=1;
		memset(book,0,sizeof(book));
		book[0]=1;
		scanf("%d%d",&n,&m);
	
		scanf("%d",&a[0]);
		sum[0]=a[0];
        for(i=1;i<n;i++)
		{
		  scanf("%d",&a[i]);
		  sum[i]=sum[i-1]+a[i];
		}
		
		//printf("%d\n",a[0]);
		for(i=0;i<n;i++)
		{
			int l=sum[i]%m;
            if(book[l]==1)
			{
				flag=0;
				break;
			 } 
			 book[l]=1;  
		}
		if(flag)
		printf("NO\n");
		else
		printf("YES\n");
		
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值