POJ- Find a multiple -(抽屉原理)
| Time Limit: 1000MS | Memory Limit: 65536K | |||
| Total Submissions: 6452 | Accepted: 2809 | Special Judge | ||
Description
Input
Output
If there are more than one set of numbers with required properties you should print to the output only one (preferably your favorite) of them.
Sample Input
5
1
2
3
4
1
Sample Output
2
2
3
/*这题在于对抽屉原理的应用,输入一个数N,然后有N行,每一行输入一个数,*/
/*求是否存在连续和能够整除N的数,并且输出该数的个数以及连续数*/
/*
抽屉原理:主要是用来求数列的某一段连续和能够整除该数列个数的问题;
先累每一个数,记录在Sum中,设i>j,则sum[i]-sum[j]则表示位置i到位置j这一段区间的和,
题目既可以简化为求(sum[i]-sum[j])%N==0的满足条件即可
所以设q,p(倍数),r1,r2(余数)为整数,
sum[i]=q*N+ri,sum[i]=p*N+rj;
ri=Sum[i]%N (ri为余数)
(sum[i]-sum[j])=>(q*N+ri)-(p*N+rj)=>(q-p)*N+(ri-rj)
既为:(sum[i]-sum[j])%N==0=>((q-p)*N+(ri-rj))%N==0
=>(ri-rj)%n==0=>ri=rj可以使得等式成立,可满足条件;
所以只需要求解存在两个ri和rj相等,就可以知道,该段位置从i+1累加到j能够被N整除
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int Num[]; /*记录输入数据*/
int Sum[]; /*记录数据的累加和*/
int Sign[]; /*记录该数据累加和取余后的情况,sign[i],0<=i<N*/
int ID[]; /*ID[i]表示该余数是否被出现过了,记录每一个余数第一次产生i的位置,且ID[0]=0*/
int Begin,End,Flat,i,N; /*Flat标记是否完成任务*/
while(scanf("%d",&N)!=EOF)
{
memset(Sum,,sizeof(Sum));
memset(ID,-,sizeof(ID)); /*因为ID存放的是该数的位置,需要初始化为-1,*/
ID[]=;/*记得标记初始位置的*/
for(i=,Flat=;i<=N;i++)
{
scanf("%d",&Num[i]);
Sum[i]=Sum[i-]+Num[i]; /*求累加和*/
Sign[i]=Sum[i]%N; /*求累加和的余数*/
if(ID[Sign[i]]>=&&Flat) /*判断该位置是否被使用过,且是否完成任务*/
{
Begin=ID[Sign[i]]; /*记录开始点*/
End=i; /*记录结束点*/
Flat=;
}
else if(Flat)
ID[Sign[i]]=i; /*如果该余数未被产生,则记录下该余数第一次出现的位置*/
}
printf("%d\n",End-Begin);
for(i=Begin+;i<=End;i++)
{
printf("%d\n",Num[i]);
} }
return ;
}
POJ- Find a multiple -(抽屉原理)的更多相关文章
- POJ 2356 Find a multiple 抽屉原理
从POJ 2356来体会抽屉原理的妙用= =! 题意: 给你一个n,然后给你n个数,让你输出一个数或者多个数,让这些数的和能够组成n: 先输出一个数,代表有多少个数的和,然后再输出这些数: 题解: 首 ...
- poj2356 Find a multiple(抽屉原理|鸽巢原理)
/* 引用过来的 题意: 给出N个数,问其中是否存在M个数使其满足M个数的和是N的倍数,如果有多组解, 随意输出一组即可.若不存在,输出 0. 题解: 首先必须声明的一点是本题是一定是有解的.原理根据 ...
- POJ2356 Find a multiple 抽屉原理(鸽巢原理)
题意:给你N个数,从中取出任意个数的数 使得他们的和 是 N的倍数: 在鸽巢原理的介绍里面,有例题介绍:设a1,a2,a3,……am是正整数的序列,试证明至少存在正数k和l,1<=k<=l ...
- POJ 3370 Halloween treats(抽屉原理)
Halloween treats Every year there is the same problem at Halloween: Each neighbour is only willing t ...
- POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理
Find a multiple Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7192 Accepted: 3138 ...
- POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理
Halloween treats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7644 Accepted: 2798 ...
- Find a multiple POJ - 2356 (抽屉原理)
抽屉原理: 形式一:设把n+1个元素划分至n个集合中(A1,A2,…,An),用a1,a2,…,an分别表示这n个集合对应包含的元素个数,则:至少存在某个集合Ai,其包含元素个数值ai大于或等于2. ...
- poj 2356 (抽屉原理)
题目链接:http://poj.org/problem?id=2356 题目大意:给你n个数,要你从n个数选出若干个数,要求这若干个数的和是n的倍数,输出选择数的个数,以及相应的数. 解题思路: 以下 ...
- POJ-2356 Find a multiple(DFS,抽屉原理)
Find a multiple Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7133 Accepted: 3122 Speci ...
随机推荐
- 忘记linux用户名和密码怎么解决?
开机进入单用户模式,可跳过密码验证修改root密码. 具体步骤如下: 开机读秒时键盘上按回车 通过操纵键盘上下方向键选择系统版本,然后按下E 通过操纵键盘上下方向键选择kernel所在行,再次按下E进 ...
- 关于ajax后台success传来json数据的问题
最近在使用JQuery的ajax方法时,需要返回的数据为json数据,在success返回中数据处理会根据返回方式不同会采用不同的方式来生成json数据.在$.ajax方法中应该是如何来处理的,简单进 ...
- 一个简单的jQuery插件开发实例
两年前写的一个简单的jQuery插件开发实例,还是可以看看的: <script type="text/javascript" src="jquery-1.7.2.m ...
- crontab格式使用方式
第1列分钟1-59第2列小时1-23(0表示子夜)第3列日1-31第4列月1-12第5列星期0-6(0表示星期天)第6列要运行的命令 下面是crontab的格式:分 时 日 月 星期 要运行的命令 这 ...
- apt-get 安装路径
apt-get安装目录和安装路径:apt-get 下载后,软件所在路径是:/var/cache/apt/archivesubuntu 默认的PATH为PATH=/home/brightman/bin: ...
- Computation expressions and wrapper types
原文地址:http://fsharpforfunandprofit.com/posts/computation-expressions-wrapper-types/ 在上一篇中,我们介绍了“maybe ...
- json_encode转成带 花括号的{ } 和 中括号的[ ] 2种 形式 json数据
//提交多个出差人员 .命名为数组 name="apply_members[] " //php接收到数据 为 数组 $aa = array('0'=>11,'1'=> ...
- WireShark 抓取Telnet包
用Python的Asyncore.dispatcher写了个小服务器,客户端使用telnet连接上去之后一直显示连接丢失,想抓下包看看 抓包结果如下: 服务器在192.168.1.102:8080 端 ...
- jQuery实例1
1.选择器: <body> <script src="jquery-2.2.4.js"></script> <div id="n ...
- ubuntu 14.04 cagl
libboost-atomic1.-dev libboost-atomic1.-dev libboost-chrono1.-dev libboost-dev libboost-program-opti ...