Intanto io considererei a parte il caso in cui il numero antipatico sia 0.
Il questo caso basta che per ogni gruppo di 0 consecutivi aggiungi alla soluzione finale in quanti modi puoi scegliere degli zeri consecutivi. Se per esempio ai 5 zeri consecutivi dei aggiungere 5*6/2=15 alla soluzione.
Se il numero antipatico non è zero io comincerei a leggere l'array che tu hai chiamato v[], tenendo 3 varabili inizio, fine e somma. somma conterrà la somma dei numeri fra v[inizio] e v[fine], continuo ad aumentare fine alzando somma finché questa non superà o eguaglia M. Se M viene eguagliato allora aumento S, altrimenti comincio ad aumentare inizio ed a diminuire somma finché questa non è minore o eguaglia M. E così via. Così vedi ogni elemento di v[] poche volte(2 o 3).
Attento però non che quando M viene eguagliato non devi aumentare S di 1, ma devi tenere conto di eventuali zeri che circondato il tratto che hai scoperto avere somma M. Quindi devi contare anche gli zeri che precedono(chiamati zp) e seguono(chiamati zs) ed aggiungere ad s (zp+1)(zs+1).
|