【DP】:CF #319 (Div. 2) B. Modulo Sum
【题目链接】: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的更多相关文章
- 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/ ...
- Codeforces Round #319 (Div. 2)B. Modulo Sum DP
B. Modulo Sum ...
- 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 ...
- 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< ...
- LeetCode:零钱兑换【322】【DP】
LeetCode:零钱兑换[322][DP] 题目描述 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成 ...
- LeetCode:完全平方数【279】【DP】
LeetCode:完全平方数[279][DP] 题目描述 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 示 ...
- 【CF1256】Codeforces Round #598 (Div. 3) 【思维+贪心+DP】
https://codeforces.com/contest/1256 A:Payment Without Change[思维] 题意:给你a个价值n的物品和b个价值1的物品,问是否存在取物方案使得价 ...
- hdoj-1421-搬寝室【DP】
搬寝室 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- Python开发【前端】:jQuery
jQuery简介 jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计的宗旨是&qu ...
随机推荐
- jQuery 小练习-拖拉画面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【find】Linux中find常见用法示例
1.根据 某个名字在某个目录下进行查找 find /etc/ -name "*.conf" 在/etc/目录下 查找 后缀名为conf 的文件
- [android] 练习PopupWindow实现对话框
练习使用Dialog实习对话框 package com.example.tsh; import android.app.Activity; import android.app.Dialog; imp ...
- Spring学习笔记:Spring整合Mybatis学习PPT(三:整合思路)
三.Spring-Mybatis的整合思路
- 中南oj 1213: 二叉树结点公共祖先
1213: 二叉树结点公共祖先 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 159 Solved: 87 [Submit][Status][Web ...
- C Primer Plus note3
上面的源代码为什么输入q的时候,程序就会退出呢? while(条件语句),status == 1是条件语句,status只要是非0值的时候,status == 1的条件就满足,程序就会运行while循 ...
- C++类继承--基类new和用派生类new的区别
实际上无论是用基类还是派生类New, 结果是一样的: #include <stdio.h> class Base { public: int a; Base(){ a=0; } virtu ...
- .NET开源工作流RoadFlow-流程运行-任务收回
如果一个任务则发送,又觉得还要想修改可以立即收回刚刚发送的任务. 任务收回条件:任务发送后下一步处理人还没有打开该任务,则在已办事项中会看到 收回 按钮,否则不能收回. 点击收回按钮再确认即可收回刚刚 ...
- 寒假来了,阿里游戏云6000、20000元新春大礼,游戏开发的骚年们r u ready?
寒假来了,游戏开发的骚年们,r u ready? 亿元云计算基金.游戏云计算解决方案.尊享VIP服务,为你“三羊开泰”! 现在参与游戏云认证,即享6000元.2万元… 最高100万云基金!走你> ...
- AndroidStudio安装教程
Android studio安装与配置 1.首先下载Android studio安装包,可以从http://www.android-studio.org/ 2.下载好该安装包之后,点击进行安装,依次出 ...