ACM数论之旅14---抽屉原理,鸽巢原理,球盒原理(叫法不一又有什么关系呢╮(╯▽╰)╭)
这章没有什么算法可言,单纯的你懂了原理后会不会运用(反正我基本没怎么用过 ̄ 3 ̄)
有366人,那么至少有两人同一天出生(好孩子就不要在意闰年啦( ̄▽ ̄"))
有13人,那么至少有两人同一月出生
这就是抽屉原理
抽屉原理:把n+1个物品放到n个抽屉里,那么至少有两个物品在同一个抽屉里
鸽巢原理:把n+1个鸽子放到n个鸽巢里,那么至少有两个鸽子在同一个鸽巢里
球盒原理:把n+1个小球放到n个球盒里,那么至少有两个小球在同一个球盒里
(你看,我都帮你们解释里一遍(≧︶≦*))
其实抽屉原理有两个
第一抽屉原理
原理1: 把多于n+k个的物体放到n个抽屉里,则至少有一个抽屉里的东西不少于两件。
原理2 :把多于mn(m乘以n)+1(n不为0)个的物体放到n个抽屉里,则至少有一个抽屉里有不少于(m+1)的物体。
第二抽屉原理
把(mn-1)个物体放入n个抽屉中,其中必有一个抽屉中至多有(m—1)个物体(例如,将3×5-1=14个物体放入5个抽屉中,则必定有一个抽屉中的物体数少于等于3-1=2)。
原理懂了,但是你会运用吗?
来看这一题
cf 577B
http://codeforces.com/problemset/problem/577/B
Modulo Sum
给你一个序列a1,a2...an,再给你一个数字m
问你能不能从中选出几个数,把他们相加,令这个和能够整除m
能就是输出YES,不能就输出NO
不知道你有木有思路(O ° ω ° O )
正常讲肯定是dp咯,加一点剪枝,勉强卡过了(因为CF上面都是单组数据,多组可能就超时了)
AC代码:
#include<cstdio>
#include<cstring>
const int N = (int)1e6 + ;
int n, m;
int a[N];
bool dp[][];//滚动数组
bool work(){
dp[][a[]] = true;
for(int i = ; i < n; i ++){
memset(dp[i & ], , sizeof(bool)*);
dp[i & ][a[i]] = true;
for(int j = ; j < m; j ++){
if(dp[(i-) & ][j]){
dp[i & ][(j + a[i]) % m] = true;
dp[i & ][j] = true;
}
}
if(dp[i & ][]) return true;
}
return dp[(n-) & ][];
}
int main(){
scanf("%d%d", &n, &m);
for(int i = ; i < n; i ++){
scanf("%d", &a[i]);
a[i] %= m;
}
puts(work() ? "YES" : "NO");
}
其实这题的n虽然范围大,但是我们可以加一个判断,n>m的话,必然输出YES
为什么?根据抽屉原理呗
先求前缀和求余m,
如果有m+1个数,那么就会产生m+1个前缀和,求余完m,就会有m+1个余数
我们知道求余完m会产生0~m-1总共m个余数
那么根据抽屉原理,至少有两个相同的余数
那么他们之间的数的和求余m就肯定是0,所以n>m的话,必然输出YES
比如
取两个下标i和j(i < j)
(a1+a2+...+ai) % m = k
(a1+a2+...+aj) % m = k
那么(ai+...+aj) %m = 0
所以问题解决啦
AC代码:
#include<cstdio>
#include<cstring>
const int N = (int)1e6 + ;
int n, m;
int a[N];
bool dp[][];//滚动数组
bool work(){
if(n > m) return true;//多加这一句,TLE的代码说不定就能AC
dp[][a[]] = true;
for(int i = ; i < n; i ++){
memset(dp[i & ], , sizeof(bool)*);
dp[i & ][a[i]] = true;
for(int j = ; j < m; j ++){
if(dp[(i-) & ][j]){
dp[i & ][(j + a[i]) % m] = true;
dp[i & ][j] = true;
}
}
if(dp[i & ][]) return true;
}
return dp[(n-) & ][];
}
int main(){
scanf("%d%d", &n, &m);
for(int i = ; i < n; i ++){
scanf("%d", &a[i]);
a[i] %= m;
}
puts(work() ? "YES" : "NO");
}
这个原理懂了,一定要学会用,要不然碰上别的题目一样不会(又在黑自己。。。( ̄▽ ̄"))
ACM数论之旅14---抽屉原理,鸽巢原理,球盒原理(叫法不一又有什么关系呢╮(╯▽╰)╭)的更多相关文章
- acm数论之旅--中国剩余定理
ACM数论之旅9---中国剩余定理(CRT)(壮哉我大中华╰(*°▽°*)╯) 中国剩余定理,又名孙子定理o(*≧▽≦)ツ 能求解什么问题呢? 问题: 一堆物品 3个3个分剩2个 5个5个分剩3个 ...
- acm数论之旅--组合数(转载)
随笔 - 20 文章 - 0 评论 - 73 ACM数论之旅8---组合数(组合大法好(,,• ₃ •,,) ) 补充:全错排公式:https://blog.csdn.net/Carey_Lu/ ...
- acm数论之旅--欧拉函数的证明
随笔 - 20 文章 - 0 评论 - 73 ACM数论之旅7---欧拉函数的证明及代码实现(我会证明都是骗人的╮( ̄▽ ̄)╭) https://blog.csdn.net/chen_ze_hua ...
- acm数论之旅(转载) -- 逆元
ACM数论之旅6---数论倒数,又称逆元(我整个人都倒了( ̄﹏ ̄)) 数论倒数,又称逆元(因为我说习惯逆元了,下面我都说逆元) 数论中的倒数是有特别的意义滴 你以为a的倒数在数论中还是1/a吗 ( ...
- acm数论之旅--数论四大定理
ACM数论之旅5---数论四大定理(你怕不怕(☆゚∀゚)老实告诉我) (本篇无证明,想要证明的去找度娘)o(*≧▽≦)ツ ----------数论四大定理--------- 数论四大定理: 1.威 ...
- poj2356 Find a multiple(抽屉原理|鸽巢原理)
/* 引用过来的 题意: 给出N个数,问其中是否存在M个数使其满足M个数的和是N的倍数,如果有多组解, 随意输出一组即可.若不存在,输出 0. 题解: 首先必须声明的一点是本题是一定是有解的.原理根据 ...
- POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理
Halloween treats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7644 Accepted: 2798 ...
- POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理
Find a multiple Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7192 Accepted: 3138 ...
- ACM数论之旅13---容斥原理(一切都是命运石之门的选择(=゚ω゚)ノ)
容斥原理我初中就听老师说过了,不知道你们有没有听过(/≧▽≦)/ 百度百科说: 在计数时,必须注意没有重复,没有遗漏. 为了使重叠部分不被重复计算,人们研究出一种新的计数方法. 这种方法的基本思想是: ...
随机推荐
- Codeforces 938 D. Buy a Ticket (dijkstra 求多元最短路)
题目链接:Buy a Ticket 题意: 给出n个点m条边,每个点每条边都有各自的权值,对于每个点i,求一个任意j,使得2×d[i][j] + a[j]最小. 题解: 这题其实就是要我们求任意两点的 ...
- 菜鸟vimer成长记——第2.3章、insert模式
大部分的Vim 命令都在非插入模式中执行,不过有些功能在插入模式中会更好实现些. 如果没有输入当前文件不存在的新文本的需求时,建议通过其他模式来操作完成. 目的 掌握inser模式下常用操作的语法和概 ...
- Oracle安装到Maven本地仓库
1.由于Maven的特性,并且之前的IDE环境已帮我们集成了Maven.而现在我们需要手动安装MVN本地仓库到电脑. 将mvn绿色安装包bin路径配置到系统环境变量Path中 验证命令: mvn –v ...
- 通过切换iframe来定位元素(用于Python+selenium自动化测试)
切换 iframe:1.由于登录按钮是在iframe上,所以第一步需要把定位器切换到iframe上2.用switch_to_frame方法切换,此处有id属性,可以直接用id定位切换 iframe 与 ...
- 零基础学python之函数与模块(附详细的代码和安装发布文件过程)
代码重用——函数与模块 摘要:构建函数,创建模块,安装发布文件,安装pytest和PEP 8插件,确认PEP8兼容性以及纠错 重用代码是构建一个可维护系统的关键. 代码组是Python中对块的叫法. ...
- PLSQL触发器,游标
--触发器 drop table emp_log create table emp_log( empno number, log_date date, new_salary number, actio ...
- Windows 本地文件搜索神器
Wox: Windows 本地文件搜索神器 下载地址: https://github.com/Wox-launcher/Wox 注: Wox只能搜索C盘下的文件,所以需要结合everything 如果 ...
- Vue+webpack项目中,运行报错Cannot find module 'chalk'的处理
刚开始用vue + webpack新建项目,在github上下载了一个示例,输入npm init >>>npm run dev 后报错 Cannot find module 'cha ...
- docker pull下来的镜像放哪儿了?
本机docker版本 docker –version Docker version 1.进入docker 目录 root@Rightsec:~# cd /var/lib/docker root@Rig ...
- js备忘录1
新建对象 赋值和取值操作 var book={ topic:"JavaScript", fat: true }; book.topic 通过点访问 book["fat& ...