CodeForces - 577B Modulo Sum(dp+bitset优化)
题目链接:点击查看
题目大意:给出一个长度为 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优化)相关推荐
- codeforces 577B Modulo Sum
题目链接:[codeforces 577B] 问能不能在大小是n的数列中取出几个数,使得他们的和是m的倍数 如果n>m,那么无论n个数是多少,都可以,这是一个定理 所以我们要讨论的就是n< ...
- Codeforces Round #319 (Div. 2)B. Modulo Sum DP
B. Modulo Sum time limit per test 2 seconds ...
- 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). ...
- HDU 5890 Eighty seven(DP+bitset优化)
题目链接 Eighty seven 背包(用bitset预处理)然后对于每个询问O(1)回答即可. 预处理的时候背包. #include <bits/stdc++.h>using name ...
- CF577B Modulo Sum(dp,抽屉原理 | bitset优化 | 二进制优化)
洛谷链接: Modulo Sum - 洛谷 思路: 明显是一个背包问题,要求子序列和整除m,即sum%m = 0,所以边取模边求和即可.但是朴素做法的时间复杂度是O(nm),会TLE.有三种优化思路 ...
- CodeForces - 1485F Copy or Prefix Sum(dp)
题目链接:点击查看 题目大意:给出数组 bbb,问可以构造出多少种满足条件的数组 aaa,规定数组 aaa 和数组 bbb 的关系如下: bi=aib_i = a_ibi=ai or bi=∑j= ...
- C 简单瞎搞题(牛客练习赛22)(bitset优化dp)
Bitset优化Dp 题目链接 一般DP做法 显然后面的数是与前面的数字相关的,所以我们有dp数组,dp[i][j]dp[i][j]dp[i][j]选取了jjj个数,iii是否可以被创造出来,如果可以 ...
- [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 ...
- 2021牛客暑期多校训练营8 F-Robots(bitset优化dp)
F-Robots 第一种第二种机器人直接O(n)O(n)O(n)判断即可. 第三种机器人暴力dp,用bitset优化. bitset<250005> b[i][j] 表示从(i,j)(i, ...
最新文章
- ORB算法原理解读【不错】
- 修正STM32F103ZE的散列文件
- 5G之争,到底争些什么?
- 工作周报:2011-11-14至2011-11-18
- JDK8新特性之接口默认方法与静态方法
- python装饰器作用和功能_Python装饰器原理与用法分析
- 鱼油账号记录程序(续) - 零基础入门学习Delphi39
- 怎么用记事本写java_如何用记事本写下第一个Java程序-Fun言
- java工程师占比_Java工资怎么样?哪个地方Java工作机会最多?
- RadonDB - 部署教程
- B站在港交所挂牌上市 12名UP主共同敲钟
- 苹果造车消息带动激光雷达股上涨 新能源整车概念下跌
- macOS Big Sur Parallels Desktop15无法使用,缺少组件
- 在Android开发中如何移除EditText上的输入焦点
- 期货与期权的主要区别与联系?
- 华硕服务器主板装系统,华硕主板安装windows11失败?BIOS设置教程
- (二)编译PVE内核5.10.6-1-pve及安装内核补丁fullconeNat
- 步进电机的使用方法和控制方式基本介绍
- 实验二:交换机基本配置
- Linux输出“Argument list too long”的解决方法
热门文章
- python基本字符_Python基本字符串,基础,之
- java heap space flex_Flash builder 4内存优化之java heap space解决办法
- 定位低效率执行SQL
- 简单了解各种序列化技术-XML序列化框架介绍
- 异常规范之阿里巴巴开发手册中的异常规范讲解
- ReactJS入门之前端开发的演变
- webflux系列--基础
- hive 判断子字符串_Java中检查空字符串(null或空白)的方法有几种?
- mysql 5.7 速度很快_MySQL5.7速度比MySQL5.6快3倍
- Spring Boot 整合 Shiro