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 ...
随机推荐
- Js的两种post方式
第一种提交post的方式是传统方式,判断浏览器进行post请求. var xmlobj; //定义XMLHttpRequest对象 function CreateXMLHttpRequest() { ...
- 深入了解——CSS3新增属性
CSS3 选择器(Selector) 写过 CSS 的人应该对 CSS 选择器不陌生,我们所定义的 CSS 属性之所以能应用到相应的节点上,就是因为 CSS 选择器模式.参考下述代码: 清单 1. C ...
- Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件(二)
Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件第二版 上次粗略的写了相同功能的代码,这次整理修复了之前的一些BUG,结构也大量修改 ...
- js--闭包的理解
从技术上来讲,在JS中,每个function都是闭包,因为它总是能访问在它外部定义的数据. 当该内部函数在外部函数外被调用,就生成了闭包. 函数内部可以直接读取全局变量. 闭包就是能够读取其他函数内部 ...
- Node.js:EventEmitter
概要:本篇博客主要介绍EventEmitter Node.js所有的异步I/O操作在完成时都会发送一个事件到事件队列.事件由EventEmitter对象提供.下面通过一个例子来说明EventEmitt ...
- Node.js:包
概要:本篇博客主要介绍了node.js中的包 包是在模块基础上更深一步的抽象,Node.js的包类似于C/C++的库函数或者Java/.Net的类库.它将某个独立的功能封装起来,用于发布.更新.依赖管 ...
- JMS理解2
使用JMS 的应用程序被称为JMS 客户端,处理消息路由与传递的消息系统被称为JMS Provider,而JMS 应用则是由多个JMS 客户端和一个JMS Provider 构成的业务系统.发送消息的 ...
- What is Flux?
Pluralsight - React and Flux for Angular Developers 1. An architectural concept. It a idea. 2. Not a ...
- Cmake常用指令
1. cmake_minimum_required(VERSION 2.8) 检查cmake的版本,至少为2.8 2. project(helloworld) ...
- C# 语言规范_版本5.0 (第4章 类型)
1. 类型 C# 语言的类型划分为两大类:值类型 (Value type) 和引用类型 (reference type).值类型和引用类型都可以为泛型类型 (generic type),泛型类型采用一 ...