Salta il coniglietto

Consideriamo un vettore V di N numeri interi, in cui le posizioni di V sono numerate da 1 a N.
Inizialmente, un coniglietto è seduto in posizione I=1.
Il tempo è discreto: se all’istante t il coniglietto è seduto in posizione I, all’istante t+1 sarà seduto in posizione

((I+V[I]) modulo N)+1.

Ricordiamo che l’operazione (X modulo N) restituisce il resto della divisione intera di X per N.

Il tuo compito consiste nello scrivere le posizioni di V che non possono essere mai raggiunte dal coniglietto.

Dati in Input

Il file input.txt è composto da due righe

  • La prima riga contiene l’intero N che indica la lunghezza del vettore V.
  • La seconda riga contiene i suoi N interi separati da uno spazio.

Dati in Output

Il file output.txt è composto da composto da due righe

  • La prima riga contiene l’intero E che indica numero di elementi nella sequenza.
  • La seconda riga contiene le E posizioni di V che non possono essere mai raggiunte dal coniglietto, elencate in ordine crescente e separate da uno spazio.

Assunzioni

  • 1 <= N <= 106
  • 0 <= V[i] <= 106 per 1 <= i <= N

Esempi di input/output

input.txt output.txt
10
3 1 4 3 7 1 2 1 5 0
5
2 4 6 7 9

Note

  • Viene garantito che esiste sempre almeno una posizione che non viene mai raggiunta dal coniglietto.
  • L’operatore modulo è realizzato con % in C/C++ e con mod in Pascal.

/*
    www.valcon.it    
    OII 2011 - Olimpiadi italiane - SALTA IL CONIGLIETTO
*/  

#include 

#define NMAX 1000000
#define SALTATO -1

long numeri[NMAX+1];


int main()
{   
    long N;
     
    FILE* fin =fopen( "input.txt", "r");   
    FILE* fout=fopen("output.txt", "w");
   
    fscanf(fin, "%ld", &N);
    for(long i=1; i <= N; i++)
       	fscanf(fin, "%ld", &(numeri[i]));
    
    long E=N;
    long pos=1;
    while(numeri[pos] != SALTATO)
    {
    	long info=numeri[pos];
    	numeri[pos]=SALTATO;
    	E--;
    	pos=(pos+info)%N+1;    	
	}    
    fprintf(fout, "%ld\n", E);
    for(long i=1; i <= N; i++)
        if(numeri[i] != SALTATO)     
	        fprintf(fout, "%ld ", i);

    return 0;
}