Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 8657 | Accepted: 3745 | Special Judge |
Description
Input
Output
Sample Input
5 1 2 3 4 1
Sample Output
2 2 3
题意:输入n,给出n个数,问能否在其中找出几个数的和是n的倍数。若能,则输出个数,及那几个数的值;若不能,则输出0.
题解:先得到数组的前n项和sum[i]=a[1]+a[2]+......+a[i],然后对sum[]取余,并记录余数分别为0~n-1时的数目rem[i]。若rem[0]大于0,及存在余数为0的sum[i],此时1~i即为解。若rem[0]等于0,即不存在余数为0的sum,此时n个sum的余数要放在n-1个抽屉中,即这n个数的余数只能是1~n-1中的一个;此时至少一个抽屉(即一个余数)对应着两个或两个以上的数。找出其中一个对应的范围,输出答案。
代码如下:
#include
#include
#include
#include
using namespace std;
const int maxn=10005;
int a[maxn];
int sum[maxn];
int rem[maxn];
int main()
{
int n;
while(~scanf("%d",&n)){
memset(sum,0,sizeof(sum));
memset(rem,0,sizeof(rem));
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
rem[sum[i]%n]++;
}
if(rem[0]>=1){
int i;
for(i=1;i<=n;i++){
if(sum[i]%n==0) break;
}
printf("%d\n",i);
for(int j=1;j<=i;j++)
printf("%d\n",a[j]);
}else{
int i;
for(i=0;i=2) break;
}
int p=0,q=0;
for(int j=1;j<=n;j++){
if(sum[j]%n==i&&p==0){
p=j;
}else if(sum[j]%n==i&&p!=0&&q==0){
q=j;
break;
}
}
printf("%d\n",q-p);
for(int j=p+1;j<=q;j++){
printf("%d\n",a[j]);
}
}
}
return 0;
}