zoukankan      html  css  js  c++  java
  • CF577B Modulo Sum 好题

    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    You are given a sequence of numbers a1, a2, ..., an, and a number m.

    Check if it is possible to choose a non-empty subsequence aij such that the sum of numbers in this subsequence is divisible by m.

    Input

    The first line contains two numbers, n and m (1 ≤ n ≤ 106, 2 ≤ m ≤ 103) — the size of the original sequence and the number such that sum should be divisible by it.

    The second line contains n integers a1, a2, ..., an (0 ≤ ai ≤ 109).

    Output

    In the single line print either "YES" (without the quotes) if there exists the sought subsequence, or "NO" (without the quotes), if such subsequence doesn't exist.

    Sample test(s)
    input
    3 5
    1 2 3
    output
    YES
    input
    1 6
    5
    output
    NO
    input
    4 6
    3 1 1 3
    output
    YES
    input
    6 6
    5 5 5 5 5 5
    output
    YES
    Note

    In the first sample test you can choose numbers 2 and 3, the sum of which is divisible by 5.

    In the second sample test the single non-empty subsequence of numbers is a single number 5. Number 5 is not divisible by6, that is, the sought subsequence doesn't exist.

    In the third sample test you need to choose two numbers 3 on the ends.

    In the fourth sample test you can take the whole subsequence.

    题意:

    给出一个数列,和一个数m,问能不能从这个数列中选出若干个数,使得这些数的和可以整除m

    整除m,也就是%m==0

    其实是个很水的01背包,每个数取和不取

    dp[i][j]表示选择到第i个数,和模m==j的情况有没有(有1,没有0)

    但是我们会发现n很大,m很小

    根据抽屉原理,当n>=m时,一定能

    当n<m时,此时的数据大小<=1000,这个时候的dp,复杂度为n*m<m*m,可以过了

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    
    using namespace std;
    
    const int maxm=1e3+10;
    const int maxn=1e6+10;
    
    int dp[maxm][maxm];
    int a[maxn];
    
    int main()
    {
        int n,m;
    
        scanf("%d %d",&n,&m);
        for(int i=1;i<=n;++i){
            scanf("%d",&a[i]);
            a[i]%=m;
        }
        if(n>=m){
            printf("YES
    ");
            return 0;
        }
    
        memset(dp,0,sizeof dp);
    
        for(int i=1;i<=n;i++){
            dp[i][a[i]]=1;
            for(int j=0;j<m;j++){
                if(dp[i-1][j]){
                    dp[i][j]=true;
                    dp[i][(j+a[i])%m]=true;
                }
            }
        }
    
        if(dp[n][0]>0)
            printf("YES
    ");
        else
            printf("NO
    ");
    
        return 0;
    }
  • 相关阅读:
    Codeforces 1316B String Modification
    Codeforces 1305C Kuroni and Impossible Calculation
    Codeforces 1305B Kuroni and Simple Strings
    Codeforces 1321D Navigation System
    Codeforces 1321C Remove Adjacent
    Codeforces 1321B Journey Planning
    Operating systems Chapter 6
    Operating systems Chapter 5
    Abandoned country HDU
    Computer HDU
  • 原文地址:https://www.cnblogs.com/-maybe/p/4833989.html
Copyright © 2011-2022 走看看