hdu5776sum
2024-08-26 19:45:13
抽屉原理:如果现在有3个苹果,放进2个抽屉,那么至少有一个抽屉里面会有两个苹果
抽屉原理的运用
现在假设有一个正整数序列a1,a2,a3,a4.....an,试证明我们一定能够找到一段连续的序列和,让这个和是n的倍数,该命题的证明就用到了抽屉原理
我们可以先构造一个序列si=a1+a2+...ai
然后分别对于si取模,如果其中有一个sk%n==0,那么a1+a2+...+ak就一定是n的倍数(该种情况得证)
下面是上一种情况的反面,即任何一个sk对于n的余数都不为0
对于这种情况,我们可以如下考虑,因为si%n!=0
那么si%n的范围必然在1——(n-1),所以原序列si就产生了n个范围在1——(n-1)的余数,于是抽屉原理就来了,n个数放进n-1个盒子里面,必然至少有两个余数会重复,那么这两个sk1,sk2之差必然是n的倍数,
而sk1-sk2是一段连续的序列,那么原命题就得到了证明了
实现代码如下
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int sum[],vis[];
int main()
{
int n,m,t,i,j,flag,a;
scanf("%d",&t);
while(t--)
{
memset(vis,,sizeof(vis));
memset(sum,,sizeof(sum));
vis[]=;flag=;
scanf("%d%d",&n,&m);
for(i=;i<=n;i++)
{
scanf("%d",&a);
sum[i]+=(sum[i-]+a)%m;
if(vis[sum[i]]){flag=;}
else vis[sum[i]]=;
}
if(flag)
printf("YES\n");
else printf("NO\n");
}
return ;
}
最新文章
- Bash:-set设置位置变量结合while和shift使用
- Matlab验证公式取值范围
- RosettaNet
- 从零单排Linux – 2 – 目录权限
- MongoDB基本命令随便敲敲
- 【canvas系列】用canvas实现一个colorpicker
- 【Python】 python对象的文件化 pickle
- Day1 《机器学习》第一章学习笔记
- python 函数enumerate(x,y)的用法
- C# Finalize和Dispose的区别
- 团队合作one
- Kubernetes 1.3.1 快速单机部署
- day11_python_1124
- oracle 变量练习
- JDBC 事务(一) 隔离级别
- 科普文:从人人网看网络科学(Network Science)的X个经典问题
- BZOJ4560 [JLoi2016]字符串覆盖
- Json化数据-调微信接口
- Hadoop运维记录系列
- TeeChart for .NET常用属性总结