Find a multiple
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. Sample Input 5 1 2 3 4 1 Sample Output 2 2 3 Source 题意:在给出的n个数中,找出连续的m个数,使m个数相加的和是n的 整数倍,若存在不止一种情况,则输出任意一种,若不存在则输出0.(此题必有解,0的情况不存在) 证明:令sum【i】为前i项和,则sun【i】%n的结果在【1,n-1】之间,有sum[i]%n有n个结果,由抽屉原理可知必有两个余数相同,即sum【j]%n=sum[i]%n,则此两项sum【】相减的结果必为n的倍数,下标为j+1~i的数为所求结果 |
代码:
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
int sum[10008],mod[10008];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int temp;
scanf("%d",&temp);
sum[i]=sum[i-1]+temp;
}
for(int i=1;i<=n;i++)
{
if(sum[i]%n==0)
{
printf("%d\n",i);
for(int j=1;j<=i;j++)
{
printf("%d\n",sum[j]-sum[j-1]);
}
break;
}
if(mod[sum[i]%n]!=0)
{
int j=mod[sum[i]%n]+1;
printf("%d\n",i-j+1);
for(;j<=i;j++)
{
printf("%d\n",sum[j]-sum[j-1]);
}
break;
}
mod[sum[i]%n]=i;
}
return 0;
}