Cabala (ottimizzazione)

Buonasera a tutti.
Stavo provando a risolvere ois_cabala (algobadge) e non riesco ad arrivare sotto il tempo di esecuzione di 1 secondo negli ultimi 3 testcase. Il mio codice è questo:

#include <stdio.h>
#include <assert.h>
//#include<vector>
//#include<cmath>
//using namespace std;

long long to_int(long long a[], int dim){
    long long temp=0, molt=1;
    for(int i=0; i<dim; i++){
        temp+=a[i]*molt;
        molt*=10;
    }
    return temp;
}

bool cifreAd(long long a[], int dim){
    for(int i=0; i<dim-1;i++){
        if(a[i]==a[i+1]){
            return false;
        }
    }
    return true;
}

void incrementa(long long a[], int &dim){
    a[0]+=3;
    int i;
    for(i=0; i<dim-1; i++){
        if(a[i]>9){
            a[i]=3;
            a[i+1]+=3;
        }
    }
    if(a[i]>9){
        a[i]=3;
        a[i+1]=3;
        dim++;
    }
}

long long occulta(int N, int M) {
    long long arrNumero[18];
    arrNumero[0]=3;
    int dim=1, maxRestoCorr=0, temp;
    do{
        if(cifreAd(arrNumero, dim)){
            temp=to_int(arrNumero, dim)%M;
            if(temp>maxRestoCorr){
                maxRestoCorr=temp;
            }
        }
        incrementa(arrNumero, dim);
    }while(dim<=N);
    return maxRestoCorr;
}

int main() {
    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, "%lld ", occulta(N, M));
    }

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

Qualcuno gentilmente potrebbe aiutarmi a trovare qualche possibilie ottimizzazione?

Hint 1: non ti serve necessariamente un array per le cifre. pensa a come potresti fare ad aggiungere una cifra a sinistra del numero puoi usare le potenze di 10 in base alla lunghezza del numero e moltiplicare per la cifra che ti serve
Hint 2: dato che ci sono più test cases, ma che i numeri sono sempre gli stessi, potresti pensare di generarteli tutti prima e di salvarteli

Altro consiglio: non sei obbligato a usare il template

Spero di esserti stato d’aiuto