选数
c++代码
给定nn个正整数a1,a2,…,ana1,a2,…,an 。 要求从其中选出若干数字, 使得这些数字的和modn=0modn=0 (对于每个下标最多只能选择一次)。
输入格式
第一行一个数字nn, 表示数字个数。
接下来一行 nn 个整数 a1,a2,…,ana1,a2,…,an , 表示这nn个数。
输出格式
第一行输出MM, 表示选择的数的个数。
第二行输出MM个正整数, 用空格隔开, 表示这些数字的下标。
如果有多种方案满足要求, 输出任意一种。
如果没有满足要求的方案 输出 −1−1。
样例输入
4
1 3 2 5
样例输出
2
2 4
样例解释
3+5=83+5=8, 8 mod 4=08 mod 4=0。
数据规模
所有数据保证 1≤n≤100000,1≤ai≤1091≤n≤100000,1≤ai≤109。
#include<bits/stdc++.h>
using namespace std;
map<int,int>mp;
int a[100001];
int pre[100001];
int n;
int main()
{
ios::sync_with_stdio(false);
cin>>n;
pre[0]=0;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
a[i]=x % n;
pre[i] = (pre[i-1] + a[i]) % n;
}
mp[0] = 0;
for(int i=1;i<=n;i++)
{
if(mp.count(pre[i]))
{
// cout<<"i= " <<i<<endl;
cout<<i-mp[pre[i]]<<endl;
// cout<<"pre[i]= " <<pre[i]<<endl;
for (int j = mp[pre[i]] + 1; j <= i; j++) cout << j << " ";
cout << endl;
return 0;
}
mp[pre[i]]=i;
}
cout<<-1;
return 0;
}