Aiuto Cabala 70/100

#include <iostream>
#include <assert.h>
#include <math.h>
using namespace std;
long long tot;
long long m;
long long n;
void calcola(long long cifra, long long num,  long long l){
      if(l>n)return;
       if(tot<num%m)tot=num%m;
       for(long long i=3;i<=9;i+=3){
            if(i!=cifra){
                num+=i*(pow(10,l));
                calcola(i,num,l+1);
                num-=i*(pow(10,l));
            }
       }
}
long long occulta(long long N, long long M) {
    // Mettete qui il codice della soluzione
    calcola(3,3,1);
   calcola(6,6,1);
    calcola(9,9,1);
    return tot;
}


int main() {
ios_base::sync_with_stdio(false);
    long long T, N, M, i;

  freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    cin>>T;
    
    for (i=0; i<T; i++) {
        tot=0;
    cin>>N>>M;
        m=M;
        n=N;
       cout<<occulta(N, M);
        cout<<" ";
    }

    return 0;
}

Di quelli che hanno risolto questo problema, qualcuno riesce a capire dove può sbagliare il mio codice? Gli ultimi due testcase sono sbagliati. Se non è chiaro qualcosa mi scuso, ma l’ho scritto un po’ di fretta.

La funzione pow potrebbe essere la causa del problema. Infatti è una funzione che prende double in input e restituisce un double, e potrebbe perdere precisione.
Quando converti da double a int tronchi il numero, quindi se pow ha restituito 99.99999999 tu lo convertirai in 99. Potresti fare così:

num += i*(long long)(pow(10, l)+0.01);

Per evitare errori di arrotondamento, o potresti scrivere una tua funzione pow che lavori con interi.

p.s.: non ho controllato, non so sei sia proprio/solo quello il problema

1 Mi Piace

Con N=18 la variabile num va in overflow: puoi verificarlo con una semplice stampa.
Il tuo algoritmo è sostanzialmente corretto ma per evitare l’overflow devi modificare il programma per gestire le potenze di 10 in altro modo.

Grazie, è bastato cambiare questo