题意
有 n n n个数字其中选择任意多个使得他们的和 % n = 0 \%n=0 %n=0,输出这个方案。
题解
使用鸽笼原理。 1 ∼ n 1\sim n 1∼n个数字相加总有两个结果的模数是相等的。
我们只要用前缀和,每求出前 n n n个数字的和,将它们存进 m a p map map,下次找到相同的模数的时候直接输出这个区间就行了。
map<int,int> mp;//数字 位置
void output(int l,int r){
cout<<r-l+1<<endl;
for(int i=l;i<=r;i++) cout<<i<<" ";
cout<<endl;
return ;
}
void MAIN(){
int n,pre=0;mp[0]=-1;
cin>>n;
for(int i=1,num;i<=n&&cin>>num;i++){
pre=(pre+num)%n;
if(mp[pre]!=0){output((mp[pre]==-1?0:mp[pre])+1,i);return;}
mp[pre]=i;
}
cout<<-1<<endl;
return ;
}