分析:就是判断简单的前缀有没有相同,注意下自身是m的倍数,以及vis[0]=true;
#include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> #include <map> #include <queue> #include <vector> using namespace std; typedef long long LL; const int N = 1e5+10; int sum[N],n,m,T; bool vis[5005]; int main(){ scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); memset(vis,0,sizeof(vis)); bool flag=0; vis[0]=true; for(int i=1;i<=n;++i){ scanf("%d",&sum[i]); if(sum[i]%m==0)flag=true; sum[i]=(sum[i]+sum[i-1])%m; if(vis[sum[i]])flag=true; vis[sum[i]]=true; } if(flag)printf("YES "); else printf("NO "); } return 0; }