题目链接:点击查看

题目大意:给出一个长度为 n 的数列,现在问能否选出一个子序列,满足其累加之和可以整除 m

题目分析:可以当做背包去思考,dpi,jdp_{i,j}dpi,j​代表的是选了前 i 个数后是否可以组合出累加之和对 m 取余等于 j 的数,那么答案显然就是看一下 dpn,mdp_{n,m}dpn,m​ 是否为 1 即可

不过时空复杂度都是 n * m 级别的,因为是 01 背包,所以可以将空间复杂度优化掉一维,到此为止分支出了两种做法:

因为 dp 数组只有 0 或 1 两种状态,所以不难想到可以用 bitset 进行优化,用 bitset 优化后时间复杂度除以 64,就在可行范围内了

还有一种做法需要一点思维,假设现在有 n 个数,如果 n > m 的话,那么对 n 个数维护一个前缀和,根据鸽巢原理可知,一定会有两个位置是相等的(因为前缀和都需要对 m 取余),比较显然的就是这两个位置之间的数求和是可以整除 m 的,所以当 n 大于 m 时直接输出 yes 即可,这样再去 dp 的时间复杂度就下降到了 m * m

代码:

// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e6+100;int a[N];bitset<2020>dp,temp;int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",a+i);a[i]%=m;if(a[i]==0)return 0*puts("YES");}if(n>m)return 0*puts("YES");dp[0]=1;for(int i=1;i<=n;i++){temp.set();temp<<=a[i];dp|=(dp<<a[i])&temp;dp|=(dp>>m);}puts(dp[m]?"YES":"NO");return 0;
}

CodeForces - 577B Modulo Sum(dp+bitset优化)相关推荐

  1. codeforces 577B Modulo Sum

    题目链接:[codeforces 577B] 问能不能在大小是n的数列中取出几个数,使得他们的和是m的倍数 如果n>m,那么无论n个数是多少,都可以,这是一个定理 所以我们要讨论的就是n< ...

  2. Codeforces Round #319 (Div. 2)B. Modulo Sum DP

                                                             B. Modulo Sum time limit per test 2 seconds ...

  3. 2016多校赛2 A 数学推公式 E 极角排序,组合数(待补) L dp+bitset优化

    2016 Multi-University Training Contest 2 A - Acperience 题意:给出w[],求S((w[i]-aB[i])^2)的最小值(B[i]为1或-1). ...

  4. HDU 5890 Eighty seven(DP+bitset优化)

    题目链接 Eighty seven 背包(用bitset预处理)然后对于每个询问O(1)回答即可. 预处理的时候背包. #include <bits/stdc++.h>using name ...

  5. CF577B Modulo Sum(dp,抽屉原理 | bitset优化 | 二进制优化)

     洛谷链接: Modulo Sum - 洛谷 思路: 明显是一个背包问题,要求子序列和整除m,即sum%m = 0,所以边取模边求和即可.但是朴素做法的时间复杂度是O(nm),会TLE.有三种优化思路 ...

  6. CodeForces - 1485F Copy or Prefix Sum(dp)

    题目链接:点击查看 题目大意:给出数组 bbb,问可以构造出多少种满足条件的数组 aaa,规定数组 aaa 和数组 bbb 的关系如下: bi=aib_i = a_ibi​=ai​ or bi=∑j= ...

  7. C 简单瞎搞题(牛客练习赛22)(bitset优化dp)

    Bitset优化Dp 题目链接 一般DP做法 显然后面的数是与前面的数字相关的,所以我们有dp数组,dp[i][j]dp[i][j]dp[i][j]选取了jjj个数,iii是否可以被创造出来,如果可以 ...

  8. [2021-09-02 contest]CF1251C,可达性统计(bitset优化dp),Boomerang Tournament(状压dp),小蓝的好友(mrx)(treap平衡树)

    文章目录 CF1251C Minimize The Integer acwing164:可达性统计 Facebook Hacker Cup 2016 Round 1 Boomerang Tournam ...

  9. 2021牛客暑期多校训练营8 F-Robots(bitset优化dp)

    F-Robots 第一种第二种机器人直接O(n)O(n)O(n)判断即可. 第三种机器人暴力dp,用bitset优化. bitset<250005> b[i][j] 表示从(i,j)(i, ...

最新文章

  1. ORB算法原理解读【不错】
  2. 修正STM32F103ZE的散列文件
  3. 5G之争,到底争些什么?
  4. 工作周报:2011-11-14至2011-11-18
  5. JDK8新特性之接口默认方法与静态方法
  6. python装饰器作用和功能_Python装饰器原理与用法分析
  7. 鱼油账号记录程序(续) - 零基础入门学习Delphi39
  8. 怎么用记事本写java_如何用记事本写下第一个Java程序-Fun言
  9. java工程师占比_Java工资怎么样?哪个地方Java工作机会最多?
  10. RadonDB - 部署教程
  11. B站在港交所挂牌上市 12名UP主共同敲钟
  12. 苹果造车消息带动激光雷达股上涨 新能源整车概念下跌
  13. macOS Big Sur Parallels Desktop15无法使用,缺少组件
  14. 在Android开发中如何移除EditText上的输入焦点
  15. 期货与期权的主要区别与联系?
  16. 华硕服务器主板装系统,华硕主板安装windows11失败?BIOS设置教程
  17. (二)编译PVE内核5.10.6-1-pve及安装内核补丁fullconeNat
  18. 步进电机的使用方法和控制方式基本介绍
  19. 实验二:交换机基本配置
  20. Linux输出“Argument list too long”的解决方法

热门文章

  1. python基本字符_Python基本字符串,基础,之
  2. java heap space flex_Flash builder 4内存优化之java heap space解决办法
  3. 定位低效率执行SQL
  4. 简单了解各种序列化技术-XML序列化框架介绍
  5. 异常规范之阿里巴巴开发手册中的异常规范讲解
  6. ReactJS入门之前端开发的演变
  7. webflux系列--基础
  8. hive 判断子字符串_Java中检查空字符串(null或空白)的方法有几种?
  9. mysql 5.7 速度很快_MySQL5.7速度比MySQL5.6快3倍
  10. Spring Boot 整合 Shiro