HDOJ 5776 sum

来源:互联网 发布:淘宝活动大全2017 编辑:程序博客网 时间:2024/05/17 22:45

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5776


题意就是说在n个数中能不能找到一段连续的子串,使得其和为m的倍数。

我们采取的办法就是直接求出所有的前缀和对m取模的值,仔细思考如果两个位置的前缀和相等,那么一定这中间这段和就是m的倍数,举个例子,1~x1的和模m为2,1~x2的和模m也为2,那么一定会有x1~x2的和模m为0.

这里还要注意一个地方,也是很多人被hack的原因,那就是说如果出现的第一个数就是m的倍数,而后面都构不成m的倍数这种情况,那么我们刚刚的做法就会有一定的问题,所以特判一下这种情况就好。

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn = 100000+5;int a[maxn], vis[maxn], s[maxn];int main(){    int T;    scanf("%d", &T);    while(T--)    {        int n,m;        scanf("%d%d", &n, &m);        int ok = 0;        s[0] = 0;        for(int i=0; i<m; i++) vis[i] = 0;        vis[0] = 1;        for(int i=1; i<=n; i++)        {            scanf("%d", &a[i]);            a[i] %= m;            s[i] = (s[i-1]+a[i])%m;            if(vis[s[i]]) ok = 1;            vis[s[i]] = 1;        }        if(ok == 1)            printf("YES\n");        else printf("NO\n");    }}


0 0
原创粉丝点击