HDU-5776 Sum

来源:互联网 发布:mac os x lion 10.7 编辑:程序博客网 时间:2024/05/30 05:01

题目大意:

给定一个数列,求是否存在连续子列和为m的倍数,存在输出YES,否则输出NO

解题思路:

官方题解:预处理前缀和,一旦有两个数模m的值相同,说明中间一部分连续子列可以组成m的倍数。 另外,利用抽屉原理,我们可以得到,一旦n大于等于m,答案一定是YES 复杂度 O(n)

代码:

#include <cstdio>#include <cstring>using namespace std;const int maxn = 5000 + 5;int vis[maxn];int main(){    int n, m, x, t, sum, flag;    scanf("%d", &t);    while(t--){        scanf("%d%d", &n, &m);        sum = 0; flag = 0;        memset(vis, 0, sizeof(vis));        for(int i = 0; i < n; ++i){            scanf("%d", &x);            sum = (sum + x) % m;            vis[sum] += 1;            if(vis[sum] >= 2) flag = 1;        }        if(flag || vis[0]) puts("YES");        else puts("NO");    }    return 0;}


0 0