Problem:
Score : 400 points

Problem Statement

There are N empty boxes arranged in a row from left to right.
The integer i is written on the i-th box from the left (1 \leq i \leq N).

For each of these boxes, Snuke can choose either to put a ball in it or to put nothing in it.

We say a set of choices to put a ball or not in the boxes is good when the following condition is satisfied:

For every integer i between 1 and N (inclusive), the total number of balls contained in the boxes with multiples of i written on them is congruent to a_i modulo 2.

Does there exist a good set of choices? If the answer is yes, find one good set of choices.

Constraints

All values in input are integers.

1 \leq N \leq 2 \times 10^5

a_i is 0 or 1.

Input

Input is given from Standard Input in the following format:

N
a_1 a_2 ... a_N

Output

If a good set of choices does not exist, print -1.

If a good set of choices exists, print one such set of choices in the following format:

M
b_1 b_2 ... b_M

where M denotes the number of boxes that will contain a ball, and b_1,\ b_2,\ ...,\ b_M are the integers written on these boxes, in any order.

Sample Input 1

3
1 0 0

Sample Output 1

1
1

Consider putting a ball only in the box with 1 written on it.

There are three boxes with multiples of 1 written on them: the boxes with 1, 2, and 3. The total number of balls contained in these boxes is 1.

There is only one box with a multiple of 2 written on it: the box with 2. The total number of balls contained in these boxes is 0.

There is only one box with a multiple of 3 written on it: the box with 3. The total number of balls contained in these boxes is 0.

Thus, the condition is satisfied, so this set of choices is good.

Sample Input 2

5
0 0 0 0 0

Sample Output 2

0

Putting nothing in the boxes can be a good set of choices.

Solution in C (GCC 5.4.1) (judge verdict: Accepted)

#include<stdio.h>
#include <string.h>
#include <stdlib.h>


int sift(int l, int r);

int main(){

	int *a, *b;
	char buf[256];
	int i, j, k, n, sumb, ret, ch;
	char *s, *t;
	int ball=0;
	int binb=1;
	
	if(fgets(buf, 256, stdin) == NULL){
		
		return 1;
		
	}
	
	n=atoi(buf);
	
	//printf("n=%d\n", n);
	
	a=(int *)malloc(sizeof(int)*n);
	b=(int *)malloc(sizeof(int)*n);
	
	//s=(char *)malloc(sizeof(char)*2*n);
	
//	if(fgets(s, 2*n, stdin) == NULL){
//		
//		return 1;
//		
//	}
	
	for(j=0; j < n; j++){
		
		ret=scanf("%d", &a[j]);
		
		
	}
	
	//printf("n=%d\n", n);
	//printf("s=%s\n", s);
	
	//i=0;
	
//	while((ch = getchar()) != EOF){
//		
//			if(ch != 32 && ch != 10){a[i++]=(ch-48);}
//		//printf("ch=%d\n", ch);
//		//printf("a[%d]=%d\n", i-1, a[i-1]);
//		
//	}
	
	//t=strtok(s, " ");
	//printf("t=%s\n", t);
	//a[i++]=atoi(t);

//	while(t != NULL){
//		//printf("t=%s\n", t);
//		a[i++]=atoi(t);
//		t=strtok(NULL, " ");
//		
//		
//	}
	
	for(i=0; i < n; i++){
		
		b[i]=0;
		
	}
	
	//printf("n=%d\n", n);
	
	for(j=n-1; j >= 0; j--){
		
		//printf("j=%d, n/2=%d\n", j, n/2);
		
		if(j > (n/2 - 1)){b[j]=a[j];}
		else{
			
			sumb=0;
			
			for(k = (n/(j+1)); k > 1; k--){
				
				sumb=sumb+b[k*(j+1)-1];
				//printf("j=%d, k=%d, sumb=%d\n", j, k, sumb);
			}
			//printf("j=%d, k=%d, sumb=%d\n", j, k, sumb);
			if(sumb % 2 == a[j]){b[j]=0;}
			else{b[j]=1;}
			
		}
		
	}
	
	//printf("n1=%d\n", n);
	
	for(i=0; i < n; i++){
		
		ball=ball+b[i];
		//printf("b[%d]=%d\n", i, b[i]);
		
	}
	
	//printf("ball=%d\n", ball);
	printf("%d\n", ball);
	
	for(i=0; i < n; i++){
		
		if(b[i] == 1){
		
		if(binb == ball){printf("%d\n", i+1);}
		else{
			printf("%d ", i+1);
			binb++;
		}
			
		}
		
	}
	
	free(a);
	free(b);
	
	
}