【题目链接】:http://codeforces.com/contest/577/problem/B

【相似题目】:http://swjtuoj.cn/problem/2383/

【题意】:给出n个数,问是否能从中选出一些数,使得这些数的和是m的倍数。

【题解】:

首先,先明白这样一个事实:

设:sum%dend=rem;

(sum:一些数的和,dend:被除数,rem:余数)

则有:(rem+n)%dend=(sum+n)%dend;

(n为一个新的数)

知道了上面的等式之后,题目就好做了:

设:est[rem]=1 表示存在余数rem,它是通过一些数的和sum%dend得到的。

对于每一个给定的n,

考察 1<=rem<=dend-1 范围内的est[rem],即考察是否存在之前一些数的和sum%dend=rem(不管sum是之前的数是怎么相加得来的)

若存在,即est[rem]=1,则可以通过(rem+n)%dend来求出新的余数,即令est[(rem+n)%dend]=1;

此外,n%dend也是新的余数,即est[n%dend]=1;

若在上面的余数中有一个等于0,即est[0]=1,则说明存在dend的倍数,直接中断循环。

【注意】

在对每一个n的循环中,不能立刻更新est数组,原因是某些情况会导致出错。

出错例子:

设:已有est[1]=1,此时n=1,dend=100;

若令est[(1+n)%dend]=1,即est[2]=1,

则又有est[(2+n)%dend]=1,即est[3]=1,

又有est[(3+n)%dend]=1,即est[4]=1......

最后整个est数组都为1,显然这是错误的。

所以,要一个 i_est 数组来临时更新est数组,最后再更新est数组(详见代码)。

 #include<stdio.h>
int num,dend,t,i,n[];
char est[],i_est[];
int main(){
scanf("%d%d",&num,&dend);
for(t=;t<num;t++){
scanf("%d",&n[t]);
}
for(t=;t<num;t++){
for(i=;i<dend;i++){
if(!est[i]) continue;
i_est[(i+n[t])%dend]=;
}
i_est[n[t]%dend]=;
for(i=;i<dend;i++){
est[i]=i_est[i];
}
if(est[]) break;
}
if(est[]){
printf("YES\n");
}
else{
printf("NO\n");
}
return ;
}

【DP】:CF #319 (Div. 2) B. Modulo Sum的更多相关文章

  1. Codeforces Codeforces Round #319 (Div. 2) B. Modulo Sum 背包dp

    B. Modulo Sum Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/577/problem/ ...

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

                                                             B. Modulo Sum                               ...

  3. Codeforces Round #319 (Div. 2) B. Modulo Sum 抽屉原理+01背包

    B. Modulo Sum time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  4. Codeforces Round #319 (Div. 2) B Modulo Sum (dp,鸽巢)

    直接O(n*m)的dp也可以直接跑过. 因为上最多跑到m就终止了,因为前缀sum[i]取余数,i = 0,1,2,3...,m,有m+1个余数,m的余数只有m种必然有两个相同. #include< ...

  5. LeetCode:零钱兑换【322】【DP】

    LeetCode:零钱兑换[322][DP] 题目描述 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成 ...

  6. LeetCode:完全平方数【279】【DP】

    LeetCode:完全平方数[279][DP] 题目描述 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 示 ...

  7. 【CF1256】Codeforces Round #598 (Div. 3) 【思维+贪心+DP】

    https://codeforces.com/contest/1256 A:Payment Without Change[思维] 题意:给你a个价值n的物品和b个价值1的物品,问是否存在取物方案使得价 ...

  8. hdoj-1421-搬寝室【DP】

    搬寝室 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  9. Python开发【前端】:jQuery

    jQuery简介 jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计的宗旨是&qu ...

随机推荐

  1. HDU 5690——All X——————【快速幂 | 循环节】

    All X Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  2. 比较2个文件内容不同行的shell脚本

    第一种:grep命令法 命令如下:grep -vxFf file1 file2 > a.txt 其中file2是大文件,file1是小文件 第一种:comm命令法 命令如下:comm  file ...

  3. Timer 控件

    1. 设置属性 Enable = true  或调用 start方法后, *_Tick 方法不会立即执行,会先等待一个时间间隔 2.timer1不管你上次的事情是否做完,它都会每个一个时间间隔做它应该 ...

  4. fabu dao fenleizhong

    IsAggregated IsAggregatedIsAggregated IsAggregatedIsAggregated IsAggregatedIsAggregated IsAggregated ...

  5. CSS代码优化(转载)

    要点1:css代码优化作用与意义 1.减少占用网页字节.在同等条件下缩短浏览器下载css代码时间,相当于加快网页打开速度:2.便于维护.简化和标准化css代码让css代码减少,便于日后维护:3.让自己 ...

  6. ubuntu下部署django

    一:保证python运行环境安装 apt-get install python 如果需要进行开发则还要安装python-dev apt-get install python-dev 二:安装djang ...

  7. Cardinality Estimation算法学习(二)(Linear Counting算法、最大似然估计(MLE))

    在上篇,我了解了基数的基本概念,现在进入Linear Counting算法的学习. 理解颇浅,还请大神指点! http://blog.codinglabs.org/articles/algorithm ...

  8. 00HTML

    一.概述 超文本标记语言(Hyper Text Markup Language),HTML是一门描述性的语言.基本语法: <标签> 内容 </标签>** 在一个网页中,HTML ...

  9. CentOS 7运维管理笔记(7)----Apache 基于端口的虚拟主机配置

    如果一台服务器只有一个IP或需要通过不同的端口访问不同的虚拟主机,可以使用基于端口的虚拟主机配置. (1) 在虚拟机的CentOS7服务器上配置 eth0:4 为192.168.1.214: (2) ...

  10. Python爬虫教程-22-lxml-etree和xpath配合使用

    Python爬虫教程-22-lxml-etree和xpath配合使用 lxml:python 的HTML/XML的解析器 官网文档:https://lxml.de/ 使用前,需要安装安 lxml 包 ...