Buongiorno programmatori! Mi ritrovo costretto a chiedere aiuto, non riesco a capire come ottimizzare per non andare fuori tempo sull’ultimo subtask di cabala.
Ho cercato di rendere il codice più leggibile possibile, essenzialmente per evitare le cifre adiacenti controllo il resto per 10 del numero attualmente in esame e concateno i multipli di 3 diversi da quel numero (quindi se ho 639 faccio 639%10==9, di conseguenza ottengo 6393 e 6396)
#include <stdio.h>
#include <assert.h>
using namespace std;
long int max = 0;
long int rec(long int cabala, int cifre, int N, int M){
if(cabala==0){
rec(3, cifre, N, M);
rec(6, cifre, N, M);
rec(9, cifre, N, M);
}
if(cabala%M > max){
max = cabala%M;
}
while(cifre < N){
cifre++;
if(cabala%10==3){
rec(cabala*10+6, cifre, N, M);
rec(cabala*10+9, cifre, N, M);
} else if(cabala%10==6){
rec(cabala*10+3, cifre, N, M);
rec(cabala*10+9, cifre, N, M);
} else if(cabala%10==9){
rec(cabala*10+6, cifre, N, M);
rec(cabala*10+3, cifre, N, M);
}
}
return max;
}
long int occulta(int N, int M) {
long int cabala = 0;
max = 0;
max = rec(cabala, 1, N, M);
return max;
}