hdu_5776_sum(前缀和维护)

题目链接: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 }
View Code
原文地址:https://www.cnblogs.com/bin-gege/p/5722040.html