sum
Accepts: 640
Submissions: 1744
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 131072/131072 K (Java/Others)
问题描述
给定一个数列,求是否存在连续子列和为m的倍数,存在输出YES,否则输出NO
输入描述
输入文件的第一行有一个正整数T(1≤T≤101\leq T \leq 101≤T≤10),表示数据组数。
接下去有T组数据,每组数据的第一行有两个正整数n,m (1≤n≤100000 1\leq n\leq 1000001≤n≤100000 ,1≤m≤5000 1\leq m\leq5000 1≤m≤5000).
第二行有n个正整数x (1≤x≤1001\leq x\leq 1001≤x≤100)表示这个数列。
输出描述
输出T行,每行一个YES或NO。
输入样例
2
3 3
1 2 3
5 7
6 6 6 6 6
输出样例
YES
NO
思路:
求序列的前缀和%m的值,如果出现了两个相等的前缀和或者是出现了0.输出YES,否则输出NO
Ac代码:
#include<stdio.h>
#include<string.h>
using namespace std;
int a[100050];
int summ[100050];
int vis[50000];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
memset(vis,0,sizeof(vis));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
int flag=0;
int sum=0;
for(int i=1;i<=n;i++)
{
sum+=a[i];
summ[i]=sum%m;
if(vis[summ[i]]==0)
vis[summ[i]]=1;
else flag=1;
if(summ[i]==0)flag=1;
}
if(flag==1)
{
printf("YES\n");
}
else printf("NO\n");
}
}