static List<Integer> find_0_sum_subset(List<Integer> A) {
	  List<Integer> prefix_sum = new ArrayList<Integer>(A);
	  for (int i = 0; i < prefix_sum.size(); ++i) {
		  prefix_sum.set(i, prefix_sum.get(i) + (i > 0 ? prefix_sum.get(i - 1) : 0));
		  prefix_sum.set(i, prefix_sum.get(i) % A.size());
	  }

	  List<Integer> table = new ArrayList<Integer>(A.size());
	  fill(table, A.size(), -1);
	  
	  for (int i = 0; i < A.size(); ++i) {
	    if (prefix_sum.get(i) == 0) {
	      List<Integer> ans = new ArrayList<Integer>(i + 1);
	      iota(ans, i + 1, 0);
	      return ans;
	    } else if (table.get(prefix_sum.get(i)) != -1) {
	      List<Integer> ans = new ArrayList<Integer>(i - table.get(prefix_sum.get(i)));
	      iota(ans, i - table.get(prefix_sum.get(i)), table.get(prefix_sum.get(i)) + 1);
	      return ans;
	    }
	    table.set(prefix_sum.get(i), i);
	  }
	  // @exclude
	  return Collections.emptyList();  // it should not happen
	  // @include
	}