【Henu ACM Round#18 B】Modulo Sum
【链接】 我是链接,点我呀:)
【题意】
在这里输入题意
【题解】
m比较小
a[i]直接看成a[i]%m就可以了。
有n个0..999之间的整数。。
如果有一个0那么就直接输出Yes.
否则要用那些数字凑0
则用cnt[0..999]记录每个数字出现的个数。
即n个物品,每个物品cnt[i]个。
然后凑和为0
->多重背包。
但每个物品的数量可能很多。
所以加一个二进制优化就好了。
把每个物品的数量转化成二进制。
转换成01背包的问题。
(物品的数目大概在1000*log2(1e6)的样子
然后容量是1000.
这时候就可以做了。
另解
如果n>m的话。
前缀和数组中肯定有sum[i]%m和sum[j]%m相同。
(抽屉原理,每个数字在0..m-1之间,然后有m+1个数字的话,显然不可能每个数字都相同。
则i+1..j之间的和就是m的倍数了。
所以直接输出YES.
否则做一个O(M^2)的背包就好。
【代码】
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int M = 1e3+10;
bool f[2][M];
int a[M],n,m;
vector<int> v;
int main()
{
ios::sync_with_stdio(0),cin.tie(0);
#ifdef LOCAL_DEFINE
freopen("rush.txt","r",stdin);
#endif
cin >> n >> m;
for (int i = 1;i <= n;i++) {
int x;cin >>x;x%=m;
a[x]++;
}
if (a[0]>0){
cout<<"YES"<<endl;
return 0;
}
for (int i = 1;i < m;i++)
if (a[i]>0){
int temp = 1;
while (a[i]>=temp){
v.push_back((1LL*temp*i)%m);
a[i]-=temp;
temp*=2;
}
if (a[i]>0) v.push_back((1LL*a[i]*i)%m);
}
if (!v.empty()){
f[0][v[0]] = 1;
if (v[0]==0) return cout<<"YES"<<endl,0;
for (int i = 1;i <(int)v.size();i++){
for (int j = 0;j < m;j++) f[i&1][j] = 0;
for (int j = 1;j <= m-1;j++)
if (f[(i&1)^1][j]){
int k = (j+v[i])%m;
f[i&1][j] = 1;
f[i&1][k] = 1;
}
f[i&1][v[i]] = 1;
if (f[i&1][0]) return cout<<"YES"<<endl,0;
}
}
cout<<"NO"<<endl;
return 0;
}
【Henu ACM Round#18 B】Modulo Sum的更多相关文章
- 【Henu ACM Round#18 F】Arthur and Walls
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 考虑,为什么一个连通块里面的空格没有变成一个矩形? 如果不是形成矩形的话. 肯定是因为某个2x2的单张方形里面. 只有一个角是墙.其 ...
- 【Henu ACM Round#18 E】Anya and Cubes
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每个数字有3种选择. 1.选中它. 2.选中它且加阶乘符号 3.不选中它(即计算和的时候不考虑它) 如果我们直接暴力写的话复杂度是\ ...
- 【Henu ACM Round#18 D】Looksery Party
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 假设现在每个人收到的信息条数存在cnt里面 那个人猜的条数为target 则如果cnt[i]==target[i] 则我们就让第i个 ...
- 【Henu ACM Round#18 C】Ilya and Sticks
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 用cnt[i]记录数字i出现的次数就好. 然后i从1e6逆序到1 如果cnt[i+1]和cnt[i]>0同时成立的话. 那么得 ...
- 【Henu ACM Round#18 A】 Multiplication Table
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 遍历i从1..n 看看x%i==0以及x/i<=n是否成立. [代码] #include <iostream> u ...
- 【Henu ACM Round#17 C】Kitahara Haruki's Gift
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 判断sum/2这个价值能不能得到就可以了. 则就是一个01背包模型了. 判断某个价值能否得到. f[j]表示价值j能否得到. f[0 ...
- 【Henu ACM Round#24 D】Iterated Linear Function
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 把B提取出来就是一个等比数列了. 求和一下会发现是这种形式. \(B*\frac{(A^n-1)}{A-1}+A^n*x\) 则求一 ...
- 【Henu ACM Round#17 D】Hexagons!
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 题目的图吓人. 找下规律就会发现从内到外是1,6,12,18 即1,16,26,36... 即1+6(1+2+3+...) 等差求和 ...
- 【Henu ACM Round#14 D】Kefa and Dishes
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 状态压缩动规. 可以写成记忆化搜索的形式. f[bit][p] 表示选取的菜的情况为bit(用0..2^(N)-1的二进制形式表示各 ...
随机推荐
- Android4.2.2下Stagefright下OMX编解码器组件的控制流
本文均属自己阅读源代码的点滴总结.转账请注明出处谢谢. 欢迎和大家交流. qq:1037701636 email:gzzaigcn2012@gmail.com Android源代码版本号Version ...
- nodejs01
一.Node.js简介 1.1 简介 V8引擎本身就是用于Chrome浏览器的JS解释部分,但是Ryan Dahl这哥们,鬼才般的,把这个V8搬到了服务器上,用于做服务器的软件. Node.js是一个 ...
- iOS - 设置导航栏之标题栏居中、标题栏的背景颜色
本章实现效果: Untitled.gif 前言: 项目中很多需求是要求自定义标题栏居中的,本人最近就遇到这中需求,如果用系统自带的titleView设置的话,不会居中,经过尝试,发现titleview ...
- [NOI2002] Robot 解题报告(数论+DP)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1408 Description 3030年,Macsy正在火星部署一批机器人. 第1秒,他 ...
- Copying
Aliasing can make program difficult to read because changes made in one place might have unexpected ...
- jquery判断页面元素是否存在
在传统的Javascript里,当我们对某个页面元素进行某种操作前,最好先判断这个元素是否存在.原因是对一个不存在的元素进行操作是不允许的. 例如: document.getElementById(& ...
- 深入理解JavaScript定时机制
容易欺骗别人感情的JavaScript定时器 JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不 ...
- PostgreSQL Replication之第七章 理解Linux高可用(2)
7.2 衡量可用性 可用性是提供商试图保证一定的可用性级别和客户可以期望的可用性或更多.在某些情况下(取决于服务合同) 收取罚款或减少申购费用是意外停机的原因. 可用性的质量使用百分数来衡量:例如,9 ...
- UVa 202 Repeating Decimals【模拟】
题意:输入整数a和b,输出a/b的循环小数以及循环节的长度 学习的这一篇 http://blog.csdn.net/mobius_strip/article/details/39870555 因为n% ...
- 学习Go语言之简易ORM框架
ORM即为对象关系映射,ORM常用于程序适配多种数据库,以达到开放扩展关闭修改的原则.笔者初学Golang,遂有意写个简易ORM框架,权当知识巩固. 首先需要有一个思想就是数据库表结构都是固定,但是每 ...