Hint: la funzione che genera tutti i numeri viene eseguita per ogni testcase
Consiglio risolutivo: Per quanto il mio aiuto non sia molto utile dato che hai faticosamente gia’ scritto tutto il codice, consiglio di scrivere una funzione che genera tutti i numeri validi da 0 fino a 10^18 una sola volta (sono tanti ma non abbastanza da mandarti fuori tempo) e poi in ogni testcase andare a controllare il modulo nei valori plausibili (esempio: se hai n = 4, i numeri fino a 9696)
Il metodo più veloce è generare i numeri in modo ricorsivo invece che provando tutti quelli composti da cifre 3, 6 e 9. Infatti quella soluzione controlla 3^N numeri mentre se li cerchi ricorsivamente ogni volta che aggiungi una cifra hai solo 2 possibilità e quindi generi “solo” circa 2^N possibilità (che sono tutte corrette, quindi non devi neanche controllarle).
Io ho fatto così: ho creato una funzione void recursion(char last_d, int curr, char len)
dove last_d è la cifra più significativa del numero, curr è il numero, len è la lunghezza del numero (in decimale).
All’inizio del programma chiamo recursion(0, 0, 0), ossia il caso in cui il numero è 0 (non conta in teoria, ma alla fine non cambia niente).
Ogni volta che viene chiamata la funzione calcola il modulo e si segna in una variabile globale il modulo massimo che trova, poi si chiama di nuovo due volte aggiungendo al numero con cui è stata chiamata un’altra cifra, è così via finchè non si raggiunge la lunghezza massima.
Ad esempio nel caso N=2 M=68 (secondo esempio di input/output nel testo):
recursion(0, 0, 0) calcola il modulo 0%68 e chiama:
— recursion(3, 3, 1) che calcola il modulo 3%68 e chiama:
— — recursion(6, 63, 2) che calcola il modulo 63%68 e si ferma
— — recursion(9, 93, 2) che calcola il modulo 93%68 e si ferma
— — recursion(3, 33 2) non viene chiamata perché avrebbe due cifre adiacenti uguali
— recursion(6, 6, 1) che calcola il modulo 6%68 e chiama …
— recursion(9, 9, 1) che calcola il modulo 9%68 e chiama …