https://www.51nod.com/onlineJudge/submitDetail.html#!judgeId=332251
我感觉这种题就是思维。
给定N个数,要求取多少个,他们的和为N的倍数。
维护前缀和。(取模有可加性)
如果mod等于0,那就从头到尾输出。
否则的话,N个数的mod 范围在1-n-1之间,
肯定有两个数的mod一样,那他们的差值就是结果。。
N个数,可以再多,但是如果和为x的倍数,这个大于N,那么就不行了。
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+1000;
int a[maxn];
int sum[maxn];
int vis[maxn];
int m;
int l,r;
int main(){
int m;
int wz;
bool flag=false;
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%d",&a[i]);
if(i>0)
sum[i]=(a[i]+sum[i-1])%m;
else
sum[i]=a[i]%m;
vis[sum[i]]++;
if(sum[i]==0){
wz=i;
flag=true;}
}
if(!flag){
l=-1;
bool kk=false;
for(int i=1;i<m&&!kk;i++){
if(vis[i]>=2){
for(int j=0;j<m;j++){
if(sum[j]==i&&l==-1)
l=j;
else if(sum[j]==i&&l!=-1)
{r=j;
kk=true;
break;}
}
}
}
printf("%d\n",r-l);
for(int i=l+1;i<=r;i++){
printf("%d\n",a[i]);
}
}
else{
printf("%d\n",wz+1);
for(int i=0;i<=wz;i++){
printf("%d\n",a[i]);
}
}
return 0;
}