链接: http://oj.daimayuan.top/problem/456
抽屉原理
若一个数%n == 0,则他是答案,否则进行一遍前缀和,若前缀和出现0则该前缀就是答案,否则前缀和取值[1, n - 1],而有n个数,则必然有两个数相等.
所以本题比有解
C++ 代码
void init()
{
cin >> n;
int s = 0;
for(int i = 1; i <= n; i ++)
{
cin >> a[i];
if(a[i] & n == 0)
{
s = i;
}
}
if(s)
{
cout << 1 << endl << s << endl;
return ;
}
for(int i = 1; i <= n; i ++)
{
b[i] = (b[i - 1] + a[i]) % n;
if(mp[b[i]])
{
cout << i - mp[b[i]] << endl;
for(int j = mp[b[i]] + 1; j <= i; j ++)
{
cout << j << ' ';
}
return;
}
if(b[i] == 0)
{
cout << i << endl;
for(int j = 1; j <= i; j ++)
cout << j << ' ';
return;
}
mp[b[i]] = i;
}
}