题目:http://acm.timus.ru/problem.aspx?space=1&num=1032
题意:
给出N个数,要求从这N个数中选出一些数,使得这些数的和是N的倍数,如果能够找到这样的组合,则输出选出的数的个数和这些数,否则输出0
分析:
作为一个数论渣,如此水题也想了好久QAQ。
N个数,前缀和%N,必定有两个数相等,那么这两个数之间的数的和就是N的倍数。
代码:
const int N = 1e6 + 9;
int cnt[N],a[N],sum[N];
int main() {
//freopen ("f.txt", "r", stdin);
int n,l=-1,r;
scanf("%d",&n);
for(int i=1; i<=n; i++)scanf("%d",&a[i]);
cnt[0]=1;
for(int i=1; i<=n; i++)sum[i]=sum[i-1]+a[i],sum[i]%=n,cnt[sum[i]]++;
int P=n;
for(int i=0; i<n; i++)if(cnt[i]>=2)P=i,i=n;
for(int i=0; i<=n; i++)
if(sum[i]==P&&l==-1)l=i;
else if(sum[i]==P)r=i,i=n+1;
printf("%d\n",r-l);
for(int i=l+1; i<=r; i++)printf("%d\n",a[i]);
return 0;
}