原文地址:http://www.boiltask.com/blog/?p=1986
sum
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 131072/131072 K (Java/Others)
Problem Description
Given a sequence, you’re asked whether there exists a consecutive subsequence whose sum is divisible by m. output YES, otherwise output NO
Input
The first line of the input has an integer T (1 leq T leq 101≤T≤10), which represents the number of test cases. For each test case, there are two lines: 1.The first line contains two positive integers n, m (1 leq n leq 1000001≤n≤100000, 1 leq m leq 50001≤m≤5000). 2.The second line contains n positive integers x (1 leq x leq 1001≤x≤100) according to the sequence.
Output
Output T lines, each line print a YES or NO.
Sample Input
2
3 3
1 2 3
5 7
6 6 6 6 6
1
2
3
4
5
2
3 3
1 2 3
5 7
6 6 6 6 6
Sample Output
YES
NO
1
2
YES
NO
中文题意:
给定一个数列,求是否存在连续子列和为m的倍数,存在输出YES,否则输出NO
官方题解:
预处理前缀和,一旦有两个数模m的值相同,说明中间一部分连续子列可以组成m的倍数。 另外,利用抽屉原理,我们可以得到,一旦n大于等于m,答案一定是YES 复杂度 O(n)
#include<stdio.h>
#include<string.h>
int flag[10000];
int main() {
int T;
scanf("%d",&T);
while(T--) {
int n,m;
scanf("%d %d",&n,&m);
memset(flag,0,sizeof(flag));
flag[0]=1;
bool win=false;
int sum=0;
for(int i=0; i<n; i++) {
int t;
scanf("%d",&t);
sum=(sum+t)%m;
if(flag[sum]==1)
win=true;
flag[sum]=1;
}
if(win)
printf("YES
");
else
printf("NO
");
}
return 0;
}
题目地址:【杭电】[5776]sum