GitBook

原文地址: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\n");
        else
            printf("NO\n");
    }
    return 0;
}

题目地址:【杭电】[5776]sum

原文地址:http://www.boiltask.com/blog/?p=1986