problem
solution
原本以为是01背包,但只能求出是否有解,没法求解- 对原数组求取模后的前缀和 sum ,则对于sum数组中的每个数,均位于[0,n - 1],共 n 种取值,而 sum[0 ~ n] 有n + 1 个数。
- 根据抽屉原理,必定至少存在两个取值相同的数,设为l ,r,也就是说,sum[l] = sum[r],区间[l + 1,r]的和为零,就是答案。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int s[maxn];
int main(){
int n; cin>>n;
for(int i = 1; i <= n; i++){
int x; cin>>x;
s[i] = (s[i-1]+x)%n;
}
int l, r;
map<int,int>ma;
for(int i = 0; i <= n; i++){
if(!ma.count(s[i]))ma[s[i]] = i;
else{
l = ma[s[i]]+1; r = i;
break;
}
}
cout<<r-l+1<<"\n";
for(int i = l; i <= r; i++)cout<<i<<" ";
return 0;
}