题目链接:hdu_5776_sum
题意:
给你一串数,问你是否有一个连续的子序列的和为m的倍数
题解:
维护一个前缀和%m的值,如果前缀和%m的值为0或者有两个前缀和%m的值相同,那么就有一个连续区间的和为m的倍数
1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;i++) 3 using namespace std; 4 5 const int N=1e5+7; 6 int a[N],vis[5555],t,n,m,tp; 7 int main(){ 8 scanf("%d",&t); 9 while(t--){ 10 scanf("%d%d",&n,&m); 11 memset(vis,0,sizeof(vis)); 12 int fg=0; 13 F(i,1,n){ 14 scanf("%d",&tp); 15 a[i]=(a[i-1]+tp)%m; 16 if(vis[a[i]])fg=1; 17 else vis[a[i]]=1; 18 if(a[i]==0)fg=1; 19 } 20 if(fg)puts("YES");else puts("NO"); 21 } 22 return 0; 23 }