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 101≤T≤10), 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 1000001≤n≤100000, 1 \leq m \leq 50001≤m≤5000). 2.The second line contains n positive integers x (1 \leq x \leq 1001≤x≤100) 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");
}
}