考虑前缀和
f
[
i
]
=
∑
1
i
a
[
i
]
%
n
f[i] = \sum_1^ia[i] \%n
f[i]=∑1ia[i]%n 若在计算前缀和的过程中
f
[
i
]
=
0
f[i] = 0
f[i]=0 那么答案就是 1到 i;
当
f
[
i
]
f[i]
f[i]的取值不存在0时,那么
f
[
i
]
f[i]
f[i]的取值范围在 1 到 n - 1; 因为有 n个数,那么根据鸽笼原理可以知道一定存在两个数
x
,
y
x,y
x,y 使得
f
[
x
]
=
f
[
y
]
f[x] =f[y]
f[x]=f[y],两个位置的前缀模数相同可以得到
∑
i
y
a
[
i
]
\sum_i^ya[i]
∑iya[i]一定是
n
n
n的倍数,不存在-1的情况;
代码参考 很棒!
int n;
int a[100005];
map<int,int> p;
void print(int l,int r){
int len = r-l+1;
cout << len << endl;
forr(i,l,r) cout << a[i] <<" ";
}
signed main()
{
cin >> n;
p[0] = -1;
int t = 0;
forr(i,1,n) cin >> a[i];
for(int i = 1;i <= n;i++){
t = (t+a[i])%n;
if(p[t] != 0) {
print((p[t]==-1?0:p[t])+1,i);
break;
}
p[t] = i;
}
return 0;
}