TLE Cabala 30/100

Buonasera a tutti, sto provando a risolvere cabala e son riuscito ad arrivare a 30/100, dopo mi va in TLE. So che devo utilizzare il backtracking, ma non ho assolutamente idea di come “potare” la ricerca dei numeri. Ho provato a dare un’occhiata tra i vari argomenti presenti sul sito ma non ho cavato un ragno dal buco (che in questo caso è il mio cranio…).

long long occulta(int N, int M) {
    
    long long ans = 0; 
    string d = "";
    
    for(int i = 0; i < N; i++) {
        if(i % 2 == 0)d += "9"; 
        else d += "6"; 
    }
    
    long long dummy = stoll(d); 
    
    while(dummy > 0) {
        string d = to_string(dummy); 
        bool check = true; 
        for(char c :  d) 
            if(c != '3' && c != '6' && c != '9') {
                //if(c == '0') c = '9'; 
                check = false; 
                break; 
            }
        for(int i = 1; i < d.size() && check; i++) 
            if(d[i] == d[i-1]) 
                {check = false; break; }
        if(check) 
            ans = max(dummy % M, ans); 
        dummy-=3; 
    }
    
    return ans; 
}

E’ un problema vecchiotto e non ricordo tutti i dettagli comunque ti consiglierei:
Più che potare i numeri genera solo quelli buoni e una tantum (per il maggior N).
Non generare stringhe per poi passare al numero per poi ripassare a stringhe.
Genera magari in maniera ricorsiva i numeri che iniziano per 3,poi quelli per 6 e infine quelli per 9.
Infine se M=3 quale sarà il risultato?

In questi tipi di problemi , ti è molto utile fare caso a questa cosa.
Se vuoi aggiungere una cifra alla destra del numero:
Mettiamo che il numero = 11111 e vogliamo aggiungere 3
11111 * 10 = 111110
111110 + 3 = 111113

Lo moltiplichi per 10 e poi aggiungi il 3. Tadan! Nessuna conversione necessaria

Se lo vuoi aggiungere alla sinistra
Devi sapere quanto è lungo il numero, ad esempio 11111 è lungo 5
Mettiamo che tu voglia aggiungere 3

3 * 10^5 (perchè è lungo 5)
3 * 100000 = 300000
300000 + 11111 = 311111

Quindi moltiplichi il numero che vuoi aggiungere per 10 alla lunghezza del numero e poi lo sommi al numero.

Questo dovrebbe aiutarti con il TLE.

Grazie della risposta, mi ero dimenticato che avevo aperto questo argomento, e l’avevo risolto proprio usando il tuo suggerimento!

1 Mi Piace