zoukankan      html  css  js  c++  java
  • HDU-5776 Sum

    题目大意:

    给定一个数列,求是否存在连续子列和为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;
    }


  • 相关阅读:
    Door man
    Borg Maze
    Agri-Net
    Highways
    Truck History
    Arctic Network
    QS Network
    用贝塞尔曲线实现水波效果
    在一个Label上设置多种颜色字体
    用UIImageView作出动画效果
  • 原文地址:https://www.cnblogs.com/wiklvrain/p/8179433.html
Copyright © 2011-2022 走看看