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

    题意:问是否存在序列n的某子序列之和是m的倍数

    首先求每位%m后的前缀和 【 (a+b)%k == (a%k +b%k)%k】, a[i]=(a[i]+a[i-1])%m,若出现余数为0,则子序列存在

    统计每个余数出现的次数,若出现两个相同余数 即a[k] == a[i] k>i, 或n>m(抽屉原理:m个数放进m-1个抽屉  必有两个数在同一个抽屉里)则子序列i+1...k必是m的倍数

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<map>
    #include<queue>
    #include<stack>
    #include<list>
    #include<set>
    using namespace std;
    typedef long long ll;
    typedef pair<ll,ll> p;
    typedef long double ld;
    #define mem(x) memset(x, 0, sizeof(x))
    #define me(x) memset(x, -1, sizeof(x))
    #define fo(i,n) for(i=0; i<n; i++)
    #define sc(x) scanf("%lf", &x)
    #define pr(x) printf("%lld
    ", x)
    #define pri(x) printf("%lld ", x)
    #define lowbit(x) x&-x
    const ll MOD = 1e18 +7;
    const ll N = 6e6 +5;
    ll a[N], vis[N];
    int main()
    {
        ll i, j, k, l=0;
        ll n, m, t, x;
        cin>>t;
        while(t--)
        {
            cin>>n>>m;
            mem(vis);
            ll f=0;
    
            for(i=1; i<=n; i++)
                cin>>a[i], a[i]+=a[i-1];
            if(n>m)
            {
                cout<<"YES"<<endl;
                continue;
            }
            for(i=1; i<=n; i++)
            {
                a[i]%=m;
                vis[a[i]]++;
                if(vis[a[i]]>1 || !a[i])
                    f=1;
            }
            if(f) cout<<"YES"<<endl;
            else cout<<"NO"<<endl;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    动态规划之矩阵连乘
    常见的开放符号服务器
    QT中的宏定义
    QT Creator项目路径设置
    批处理-日常小功能用法记录
    Qt Creator快捷键记录
    利用Navicat premium实现将数据从Oracle导入到MySQL
    php BCmath 封装类
    PHP 反射类
    Html标签生成类
  • 原文地址:https://www.cnblogs.com/op-z/p/10743344.html
Copyright © 2011-2022 走看看