Find a multiple
Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 6400 | Accepted: 2785 | Special Judge |
Description
The input contains N natural (i.e. positive integer) numbers ( N <= 10000 ). Each of that numbers is not greater than 15000. This numbers are not necessarily different (so it may happen that two or more of them will be equal). Your task is to choose a few of given numbers ( 1 <= few <= N ) so that the sum of chosen numbers is multiple for N (i.e. N * k = (sum of chosen numbers) for some natural number k).
Input
The first line of the input contains the single number N. Each of next N lines contains one number from the given set.
Output
In case your program decides that the target set of numbers can not be found it should print to the output the single number 0. Otherwise it should print the number of the chosen numbers in the first line followed by the chosen numbers themselves (on a separate line each) in arbitrary order.
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.
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
Source
Ural Collegiate Programming Contest 1999
题目链接:http://poj.org/problem?id=2356
题目大意:输入n,再输入n个数,找到这n个数中连续的m个数,使这m个数的和是n的倍数,输出m和这m个数
题目分析:构造余数抽屉,计算这个数列的出前缀和,如果前缀和可以直接被n整除则纪录起点和终点退出循环并输出,如果不能,则用hash存当前得到的余数的下标,因为我们知道前缀和数组的个数也是n个,若前缀和中找不到n的被数,根据抽屉原理,其对n取余得到的余数中至少有两个是相同的,再根据同余定理, a与b对n同余,则(a - b) mod n == 0,记录下两个余数相同的前缀和的下标即可,一个做为起点一个做为终点
题目链接:http://poj.org/problem?id=2356
题目大意:输入n,再输入n个数,找到这n个数中连续的m个数,使这m个数的和是n的倍数,输出m和这m个数
题目分析:构造余数抽屉,计算这个数列的出前缀和,如果前缀和可以直接被n整除则纪录起点和终点退出循环并输出,如果不能,则用hash存当前得到的余数的下标,因为我们知道前缀和数组的个数也是n个,若前缀和中找不到n的被数,根据抽屉原理,其对n取余得到的余数中至少有两个是相同的,再根据同余定理, a与b对n同余,则(a - b) mod n == 0,记录下两个余数相同的前缀和的下标即可,一个做为起点一个做为终点
#include <cstdio>
#include <cstring>
int const MAX = 15005;
int num[MAX], s[MAX], mod[MAX];
int main()
{
int n, st = 1, ed = 1;
scanf("%d", &n);
memset(mod, 0, sizeof(mod));
memset(s, 0, sizeof(s));
for(int i = 1; i <= n; i++)
{
scanf("%d", &num[i]);
s[i] = s[i - 1] + num[i];
if(s[i] % n == 0)
{
ed = i;
break;
}
else if(!mod[s[i] % n])
mod[s[i] % n] = i;
else
{
st = mod[s[i] % n] + 1;
ed = i;
break;
}
}
printf("%d\n", ed - st + 1);
for(int i = st; i <= ed; i++)
printf("%d\n", num[i]);
}