题目大意:
有n个数,问存不存在连续子序列之和是m的倍数
题解:
抽屉原理
如果前缀和存在%m后==0的不用再考虑,YES
如果存在余数为1~m-1的个数大于一个时我们也能保证为YES (此时这两段区间作差一定是m的倍数)
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<iostream>
#include<cstring>
#include<map>
#define ll long long
using namespace std;
int a[100010],b[5010];
int sum[100010];
int main()
{
int T,n,m;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
sum[0]=0;
for(int i=1; i<=n; ++i)
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
for(int i=0; i<=m; ++i)b[i]=0;
for(int i=1; i<=n; ++i)
b[sum[i]%m]++;
bool flag=0;
if(b[0])
flag=1;
else
{
for(int i=1; i<=m; ++i)
if(b[i]>1)
{
flag=1;
break;
}
}
if(flag)
puts("YES");
else puts("NO");
}
return 0;
}