输入n个自然数(也就是正整数) ( N <= 10000 ),并且都不超过15000。可能有重复。你的任务是从中选择其中一些数,( 1 <= 个数<= N ),令到选择的这些数的和等于N的倍数。即N*K=选择的数的和,K为某一自然数。
input:
首行为N,以下N行为指定的数。
output:
假如你认为没有可行的答案,则输出0。否则首行输出选择的数的个数。以下一行一个输出每个数,按任意顺序即可。
input:
5
1
2
3
4
1
output:
2
2
3
分析:
用sum[i]表示1到i的总和,如果sum[i]%n==0则1到i是一个解;如果sum[i]和sum[j]同时%n,且值相同则i+1到j则一定是一个解。
【参考程序】:
#include<iostream>
using namespace std;
int n,bx,by,ans;
int sum[10001],a[10001];
void work(int x,int y)
{
bx=x;by=y;ans=by-bx+1;
}
int main()
{
scanf("%d",&n);
memset(sum,0,sizeof(sum));
ans=0xFFFFFFF;
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i]=(sum[i-1]+a[i])%n;
if (!sum[i]) work(1,i);
}
for (int i=1;i<=n-1;i++)
for (int j=i+1;j<=n;j++)
if (sum[i]==sum[j]) //sum[i]%n==sum[j]%n
work(i+1,j);
if (ans==0xFFFFFFF) printf("0\n");
else
{
printf("%d\n",ans);
for (int i=bx;i<=by;i++) printf("%d\n",a[i]);
}
return 0;
}