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 (), 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 (, ).
2.The second line contains n positive integers x () 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
在bc上暴力过了,但杭电上超时,看了看解题报告才知道还要利用抽屉原理。
预处理前缀和,枚举两个前缀和算出差值就行。但根据抽屉原理,如果n大于等于m,就一定有符合条件的序列
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <cstdio>
#include <map>
#include <cmath>
#include <algorithm>
#define INF 0x3f3f3f3f
#define MAXN 100010
#define mod 1000000007
using namespace std;
int a[MAXN],sum[MAXN];
int main()
{
int t,n,m,x;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
bool flag=false;
memset(sum,0,sizeof(sum));
for(int i=1;i<=n;++i)
{
scanf("%d",&x);
sum[i]=sum[i-1]+x;
}
if(n>=m)
{
printf("YES\n");
continue;
}
for(int i=n;i>=0;--i)
for(int j=i-1;j>=0;--j)
{
int tmp=sum[i]-sum[j];
if(tmp%m==0)
{
flag=true;
break;
}
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}