Cabala 10/100 Output Incorretto / TLE

Buongiornissimo! E’ da giorni ormai che sto cercando di risolvere cabala, non capendo come posso andare avanti col codice.
Quello che il mio algoritmo fa, per ora, è generare tutti i numeri “utili” in un set, per poi testarli uno a uno, senza ricorsione. Chiedo aiuto.

#include <stdio.h>
#include <assert.h>
#include <set>
#include <cmath>
#include <iostream>
using namespace std;

set<int> p;
int occulta(int N, int M) {
    int i = 0;
    int a;
    int c;
    int max = 0;
    auto it = p.begin();
    do {
        a = *it;
        cout << a << endl;
        c = a % M;
        if(max < c){
            max = c; 
        }
        it++;
    } while(a<=pow(10, N));
    return max;
}

bool checkDigit(int c){
    while (c != 0) {
        int current_digit = c % 10;
        c /= 10;
        int digit = c % 10;
        if (current_digit == digit || current_digit % 3 != 0){
            return false;
        }
    }
    return true;
}

void inizia(){
    int n = 100000;
    while(n!=1){
        if(checkDigit(n)){
            p.insert(n);
        }
        n--;
    }
    /*
    int i = 0;
    for (auto it = p.begin(); i<10; ++it) {
    cout << *it << " ";
    i++;
    }*/
}

int main() {
    inizia();
    FILE *fr, *fw;
    int T, N, M, i;

    fr = fopen("input.txt", "r");
    fw = fopen("output.txt", "w");
    assert(1 == fscanf(fr, "%d", &T));
    for (i=0; i<T; i++) {
        assert(2 == fscanf(fr, "%d %d", &N, &M));
        fprintf(fw, "%d ", occulta(N, M));
    }

    fprintf(fw, "\n");
    fclose(fr);
    fclose(fw);
    return 0;
}

Ciao, per quanto la tua soluzione possa sembrare efficace, in realtà nei casi di test più ardui (ma già con N \leq 5 inizia a dare problemi) darà inequivocabilmente TLE. Per questo, ti consiglio vivamente di implementare l’algoritmo in maniera ricorsiva – che è come è stato pensato dagli autori.

Qualche suggerimento per risolvere:

  • I parametri che ti interessano sono il numero che stai considerando e quante cifre puoi
    “aggiungere”.
  • La funzione dovrà restituire il massimo valore di C mod M, eventualmente chiamando sé stessa per “aggiungere” cifre al numero (quindi 3, 6 e 9).
  • Attento al caso limite! Se il numero ha N cifre, bisogna stoppare la ricorsione!

Spero di essere stato d’aiuto, buona giornata :slight_smile:

1 Mi Piace