// // messaggi.cpp // messaggi // // Created by Francesco Donato on 09/11/12. // #include //#include #include using namespace std; const int MAX_N = 100000; int msg[MAX_N+3]; //contiene il segnale di fumo preceduto da 111 int nMessaggi[MAX_N+3]; //nMessaggi[i] contine la soluzione del problema se l'input avesse lunghezza i (con l'input normalizzato con il prefisso 111) int n; int main(int argc, const char * argv[]) { ifstream fin("input.txt"); assert(fin); fin >> n; msg[0] = msg[1] = msg[2] = 1; nMessaggi[0] = nMessaggi[1] = nMessaggi[2] = 1; for(int i=3;i> msg[i]; nMessaggi[i]=0; if( msg[i] == 0) //potrei aver letto A nMessaggi[i]+= nMessaggi[i-1]; if( msg[i-1] == 0 && msg[i]==0 ) //o potrei aver letto B nMessaggi[i]+= nMessaggi[i-2]; if( msg[i-2] == 0 && msg[i-1] == 0 && msg[i]==1 ) //o potrei aver letto C nMessaggi[i]+= nMessaggi[i-3]; if( msg[i-2] == 0 && msg[i-1] == 1 && msg[i]==0 ) //o potrei aver letto D nMessaggi[i]+= nMessaggi[i-3]; if( msg[i-3] == 0 && msg[i-2] == 0 && msg[i-1]==1 && msg[i]==0 ) //o potrei aver letto E nMessaggi[i]+= nMessaggi[i-4]; if( msg[i-3] == 0 && msg[i-2] == 1 && msg[i-1]==0 && msg[i]==0 ) //o potrei aver letto F nMessaggi[i]+= nMessaggi[i-4]; if( msg[i-3] == 0 && msg[i-2] == 1 && msg[i-1]==1 && msg[i]==0 ) //o potrei aver letto G nMessaggi[i]+= nMessaggi[i-4]; //devo tenere solo l'ultima cifra while(nMessaggi[i]>10) nMessaggi[i] = nMessaggi[i] % 10; } fin.close(); //cout << nMessaggi[n+2]; ofstream fout("output.txt"); assert(fout); fout << nMessaggi[n+2]; fout.close(); return 0; }