博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 3370 鸽笼原理知识小结
阅读量:6079 次
发布时间:2019-06-20

本文共 870 字,大约阅读时间需要 2 分钟。

中学就听说过抽屉原理,可惜一直没机会见识,现在这题有鸽笼原理的结论,但其实知不知道鸽笼原理都可以做

先总结一下鸽笼原理:

有n+1件或n+1件以上的物品要放到n个抽屉中,那么至少有一个抽屉里有两个或两个以上物品。

如果你知道这个结论:

a1,a2,a3...am是正整数序列,至少存在整数k和r,1<=k<r<=m,使得ak+a(k+1)+...+a(r)是m的倍数。

证明比较简单:

Sk表示前k个数之和,

 (1)若Sk%m==0,前k个数就是m的倍数

(2)如果Sn与St模m同余,那么从t+1到n这些数之和模m等于0.

即使你不知道这个结论,DP厉害的话,应该能想到用 前n项的和 去思考的思想

有这个结论知必有解。

贴代码之前,在总结一下鸽笼原理的结论:

推论1:m只鸽子,n个笼,则至少有一个鸽笼里有不少于[(m-1)/n]+1只鸽子。

推论2:若取n*(m-1)+1个球放进n个盒子,则至少有1个盒子有m个球。

推论3:若m1,m2,...mn是n个正整数,而且(m1+m2+...+mn)/n>r-1

则m1,m2,...mn中至少有一个数不小于r

直接贴代码吧:没啥解释的,700多MS,当时judge的时候我还害怕TLE

 

#include
#include
using namespace std;#define N 100002int sum[N],pos[N];int main(){ int c,n,i,r,t,j; while(scanf("%d%d",&c,&n),c+n) { memset(pos,-1,sizeof(pos)); bool flag=false; scanf("%d",&sum[0]); sum[0]%=c; pos[sum[0]]=0; if(sum[0]==0){printf("1\n");flag=1;} for(i=1;i

 

 

转载地址:http://dnhgx.baihongyu.com/

你可能感兴趣的文章
字符串操作【转】
查看>>
ASYNC PROGRAMING IN JAVASCRIPT[转]
查看>>
几扇鲜为人知的Windows XP自动运行后门
查看>>
电子书下载:Construct Game Development Beginner's Guide
查看>>
此实现不是 Windows 平台 FIPS 验证的加密算法的一部分的解决办法方案
查看>>
git学习笔记(二)—— 创建版本库&&版本管理
查看>>
.Net Remoting(应用程序域) - Part.1
查看>>
windows server 2008下的一些设置技巧及优化
查看>>
[置顶] lvs-tun隧道模式搭建
查看>>
PHP ADLogin
查看>>
Web服务器 之 Debian下给apache加载ssl
查看>>
CTreeCtrl控件使用技巧
查看>>
第三届云计算大会 - Dell云计算: 企业的有效转型策略(转载)
查看>>
关于延迟时间的一点智慧
查看>>
33.NET对加密和解密的支持
查看>>
MVC文件图片ajax上传轻量级解决方案,使用客户端JSAjaxFileUploader插件02-多文件上传...
查看>>
jQuery显示和隐藏 常用的状态判断方法
查看>>
[翻译]Shape comparison language
查看>>
【Android Lock Pattern】图案解锁(一):LockPatternView源代码
查看>>
NLP常用信息资源
查看>>