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; }