题目:
题意:在输入的序列的子序列中,有没有能够整除m的,有输出YES,没有输出NO。
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int num[100010];
int flag[100010];
int main()
{
int t;
scanf("%d",&t);
while(t--) //测试事例个数;
{
memset(flag,0,sizeof(flag));
int n,m;
scanf("%d%d",&n,&m);
flag[0]=1;
//将数列的每项相加;
for(int i=0; i<n; i++)
{
int a;
scanf("%d",&a);
if(i!=0)
{
num[i]=num[i-1]+a;
}
else
{
num[i]=a;
}
}
int an=0;
/*从第一项开始每加一项 都除以m,前面已经定义flag[0]=1,
即若余数为零则an=1,若再次出现之前出现过的余数 (前面相加的子序列的和处以m中出现过的余数)
即刚加上的这一项能够被m整除 an=1;*/
for(int i=0; i<n; i++)
{
if(flag[num[i]%m]==1)
an=1;
flag[num[i]%m]=1;
}
if(an==1)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
}