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

    原题链接

    • 题意:给出一个序列长度为 (n leqslant 1e6)(a_i leqslant 1e9)然后要求取某些数字,其和为 (m leqslant 3000) 的倍数,是否可以。
    • 题解:先把所有数都作为 (a_i = a_i mod m) 存起来。然后可知,如果数量大于 (m),那么一定有两个数可以构成 (m)。否则,变成 (3000 imes 3000) 的动态规划问题。
    • 代码:
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N = 1e6 + 10;
    int a[N];
    int dp[3333][3333];
    int n, m;
    map<int,int>mp;
    map<int,int>ans;
    void solve() {
        int n, m;cin >> n >> m;
        if (n > m) {
            puts("YES");return;
        }
        for (int i = 1; i <= n; i ++) {
            cin >> a[i];
            a[i] %= m;
        }
        sort(a + 1, a + 1 + n);
        for (int i = 1; i <= n; i ++) {
            mp[a[i]] =1;
        }
        if (mp[0]) {
            puts("YES
    ");return;
        }   
        reverse(a + 1, a + 1 + n);
        for (int i = 2; i <= n; i ++) {
            dp[i-1][a[i-1]] = 1;
            for (int j =m-1; j >= 0; j--) {
                if (dp[i-1][j]) {
                    dp[i][(j + a[i])%m] = 1;
                }
            }
            for (int j = 0; j <= m; j ++) {
                dp[i][j] = max(dp[i][j], dp[i-1][j]);
            }
        }
        if (dp[n][0]) {
            puts("YES");
        } else
        puts("NO");
    }
    int main() {
        int t = 1;//cin >> t;
        while (t--) solve();
        return 0;
    }
    
  • 相关阅读:
    Windows系统结构
    Windows系统基本概念
    基本NT式驱动代码结构
    数据切割
    虚函数
    基类和派生类:谈继承
    jQuery简单的上拉加载
    检测是否为数组
    倒计时案例分析
    获得总的毫秒数
  • 原文地址:https://www.cnblogs.com/Xiao-yan/p/14745596.html
Copyright © 2011-2022 走看看