Cabala 10/100 malgrado superi tutti gli esempi allegati

Buonasera a tutti.
Durante la risoluzione del problema “cabala”, ho riscontrato il seguente problema: malgrado il codice che ho scritto produca il risultato previsto con tutti gli input di prova provvisti negli allegati della task (“cabala.input0.txt” e rispettivo “cabala.output10.txt”), una volta caricato come submission sul portale viene valutato 10/100.
Qualcuno ha magari qualche esempio di input e output più “difficile” per provare a capire cosa sto sbagliando?

Grazie in anticipo.

Aggiungo una precisazione: tutti i casi sbagliati sono dati come Output non corretto e non viene mai segnalato il superamento dell’execution time limit.

Ciao, potresti mandare il codice (magari commentando brevemente la logica risolutiva) in modo da capire cosa c’è che non va?

I file di input, che io sappia, purtroppo non sono disponibili. Buona giornata :slight_smile:

Ricontrollando di nuovo il codice prima di mandarlo qui ho trovato il problema (una banale variabile long long che veniva passata da una temporanea di tipo int). Allego comunque la mia soluzione, che possa essere utile a qualcuno nella mia stessa situazione.

Grazie ancora e mi scuso per il tempo perso

#include <stdio.h>
#include <assert.h>

using namespace std;

/**
 * Calcola a^n
 * Params:
 *  - int a: base
 *  - int n: esponente
 * Returns: risultato di a^n
 */
long long exp(int a, int n)
{
    if (n == 0)
        return 1;

    return a * exp(a, n - 1);
}

/**
 * Trova numero della cabala ricorsivamente
 * Params:
 *  - int N: max numero di cifre
 *  - int M: numero la divisione per cui dobbiamo massimizzare il resto
 *  - int cifra: su quale cifra si deve operare a questa ricorsione (0 -> unità, 1 -> decine...)
 *  - long long n: numero della cabala generato dalla ricorsione precedente
 *  - int &max: massimo resto trovato
 * Returns: void
 */
void cabala(int N, int M, int cifra, long long n, int &max)
{
    // Se non si è raggiunto il massimo delle cifre
    if (cifra < N)
    {
        // Per tutti i multipli di 3 != 0
        for (int i = 3; i <= 9; i += 3)
        {
            // Verifica che la cifra non sia uguale a quella adiacente
            if (cifra == 0 || i != n / exp(10, cifra - 1) % 10)
            {
                long long newcabala = n + exp(10, cifra) * i;
                int resto = newcabala % M;

                // Aggiorna resto massimo
                if (resto > max)
                {
                    max = resto;
                }

                // Chiamata ricorsiva a cui si passa il numero della cabala generato da questa ricorsione
                // La prossima a sua volta chiamerà cabala aggiungendo al numero tutti i multipli di 3
                // verificando prima che non siano uguali alla cifra adiacente
                cabala(N, M, cifra + 1, newcabala, max);
            }
        }
    }
}

int occulta(int N, int M)
{
    int max = -1;

    cabala(N, M, 0, 0, max);

    return max;
}

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, "%d ", occulta(N, M));
    }

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

Sono contento che tu abbia risolto, buona fortuna nella risoluzione dei problemi :wink: